/* Shared library add-on to xtables for CHECKSUM * * (C) 2002 by Harald Welte <laforge@gnumonks.org> * (C) 2010 by Red Hat, Inc * Author: Michael S. Tsirkin <mst@redhat.com> * * This program is distributed under the terms of GNU GPL v2, 1991 * * libxt_CHECKSUM.c borrowed some bits from libipt_ECN.c */ #include <stdio.h> #include <xtables.h> #include <linux/netfilter/xt_CHECKSUM.h> enum { O_CHECKSUM_FILL = 0, }; static void CHECKSUM_help(void) { printf( "CHECKSUM target options\n" " --checksum-fill Fill in packet checksum.\n"); } static const struct xt_option_entry CHECKSUM_opts[] = { {.name = "checksum-fill", .id = O_CHECKSUM_FILL, .flags = XTOPT_MAND, .type = XTTYPE_NONE}, XTOPT_TABLEEND, }; static void CHECKSUM_parse(struct xt_option_call *cb) { struct xt_CHECKSUM_info *einfo = cb->data; xtables_option_parse(cb); einfo->operation = XT_CHECKSUM_OP_FILL; } 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, .print = CHECKSUM_print, .save = CHECKSUM_save, .x6_parse = CHECKSUM_parse, .x6_options = CHECKSUM_opts, }; void _init(void) { xtables_register_target(&checksum_tg_reg); }