/* Shared library add-on to xtables for CHECKSUM * * (C) 2002 by Harald Welte * (C) 2010 by Red Hat, Inc * Author: Michael S. Tsirkin * * This program is distributed under the terms of GNU GPL v2, 1991 * * libxt_CHECKSUM.c borrowed some bits from libipt_ECN.c */ #include #include #include #include #include #include #include static void CHECKSUM_help(void) { printf( "CHECKSUM target options\n" " --checksum-fill Fill in packet checksum.\n"); } static const struct option CHECKSUM_opts[] = { {.name = "checksum-fill", .has_arg = false, .val = 'F'}, XT_GETOPT_TABLEEND, }; static int CHECKSUM_parse(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_target **target) { struct xt_CHECKSUM_info *einfo = (struct xt_CHECKSUM_info *)(*target)->data; switch (c) { case 'F': xtables_param_act(XTF_ONLY_ONCE, "CHECKSUM", "--checksum-fill", *flags & XT_CHECKSUM_OP_FILL); einfo->operation = XT_CHECKSUM_OP_FILL; *flags |= XT_CHECKSUM_OP_FILL; break; default: return 0; } return 1; } static void CHECKSUM_check(unsigned int flags) { if (!flags) xtables_error(PARAMETER_PROBLEM, "CHECKSUM target: Parameter --checksum-fill is required"); } static void CHECKSUM_print(const void *ip, const struct xt_entry_target *target, int numeric) { const struct xt_CHECKSUM_info *einfo = (const struct xt_CHECKSUM_info *)target->data; printf("CHECKSUM "); if (einfo->operation & XT_CHECKSUM_OP_FILL) printf("fill "); } static void CHECKSUM_save(const void *ip, const struct xt_entry_target *target) { const struct xt_CHECKSUM_info *einfo = (const struct xt_CHECKSUM_info *)target->data; if (einfo->operation & XT_CHECKSUM_OP_FILL) printf("--checksum-fill "); } static struct xtables_target checksum_tg_reg = { .name = "CHECKSUM", .version = XTABLES_VERSION, .family = NFPROTO_UNSPEC, .size = XT_ALIGN(sizeof(struct xt_CHECKSUM_info)), .userspacesize = XT_ALIGN(sizeof(struct xt_CHECKSUM_info)), .help = CHECKSUM_help, .parse = CHECKSUM_parse, .final_check = CHECKSUM_check, .print = CHECKSUM_print, .save = CHECKSUM_save, .extra_opts = CHECKSUM_opts, }; void _init(void) { xtables_register_target(&checksum_tg_reg); }