1*a71a9546SAutomerger Merge Worker /* Shared library add-on to xtables for CHECKSUM
2*a71a9546SAutomerger Merge Worker *
3*a71a9546SAutomerger Merge Worker * (C) 2002 by Harald Welte <[email protected]>
4*a71a9546SAutomerger Merge Worker * (C) 2010 by Red Hat, Inc
5*a71a9546SAutomerger Merge Worker * Author: Michael S. Tsirkin <[email protected]>
6*a71a9546SAutomerger Merge Worker *
7*a71a9546SAutomerger Merge Worker * This program is distributed under the terms of GNU GPL v2, 1991
8*a71a9546SAutomerger Merge Worker *
9*a71a9546SAutomerger Merge Worker * libxt_CHECKSUM.c borrowed some bits from libipt_ECN.c
10*a71a9546SAutomerger Merge Worker */
11*a71a9546SAutomerger Merge Worker #include <stdio.h>
12*a71a9546SAutomerger Merge Worker #include <xtables.h>
13*a71a9546SAutomerger Merge Worker #include <linux/netfilter/xt_CHECKSUM.h>
14*a71a9546SAutomerger Merge Worker
15*a71a9546SAutomerger Merge Worker enum {
16*a71a9546SAutomerger Merge Worker O_CHECKSUM_FILL = 0,
17*a71a9546SAutomerger Merge Worker };
18*a71a9546SAutomerger Merge Worker
CHECKSUM_help(void)19*a71a9546SAutomerger Merge Worker static void CHECKSUM_help(void)
20*a71a9546SAutomerger Merge Worker {
21*a71a9546SAutomerger Merge Worker printf(
22*a71a9546SAutomerger Merge Worker "CHECKSUM target options\n"
23*a71a9546SAutomerger Merge Worker " --checksum-fill Fill in packet checksum.\n");
24*a71a9546SAutomerger Merge Worker }
25*a71a9546SAutomerger Merge Worker
26*a71a9546SAutomerger Merge Worker static const struct xt_option_entry CHECKSUM_opts[] = {
27*a71a9546SAutomerger Merge Worker {.name = "checksum-fill", .id = O_CHECKSUM_FILL,
28*a71a9546SAutomerger Merge Worker .flags = XTOPT_MAND, .type = XTTYPE_NONE},
29*a71a9546SAutomerger Merge Worker XTOPT_TABLEEND,
30*a71a9546SAutomerger Merge Worker };
31*a71a9546SAutomerger Merge Worker
CHECKSUM_parse(struct xt_option_call * cb)32*a71a9546SAutomerger Merge Worker static void CHECKSUM_parse(struct xt_option_call *cb)
33*a71a9546SAutomerger Merge Worker {
34*a71a9546SAutomerger Merge Worker struct xt_CHECKSUM_info *einfo = cb->data;
35*a71a9546SAutomerger Merge Worker
36*a71a9546SAutomerger Merge Worker xtables_option_parse(cb);
37*a71a9546SAutomerger Merge Worker einfo->operation = XT_CHECKSUM_OP_FILL;
38*a71a9546SAutomerger Merge Worker }
39*a71a9546SAutomerger Merge Worker
CHECKSUM_print(const void * ip,const struct xt_entry_target * target,int numeric)40*a71a9546SAutomerger Merge Worker static void CHECKSUM_print(const void *ip, const struct xt_entry_target *target,
41*a71a9546SAutomerger Merge Worker int numeric)
42*a71a9546SAutomerger Merge Worker {
43*a71a9546SAutomerger Merge Worker const struct xt_CHECKSUM_info *einfo =
44*a71a9546SAutomerger Merge Worker (const struct xt_CHECKSUM_info *)target->data;
45*a71a9546SAutomerger Merge Worker
46*a71a9546SAutomerger Merge Worker printf(" CHECKSUM");
47*a71a9546SAutomerger Merge Worker
48*a71a9546SAutomerger Merge Worker if (einfo->operation & XT_CHECKSUM_OP_FILL)
49*a71a9546SAutomerger Merge Worker printf(" fill");
50*a71a9546SAutomerger Merge Worker }
51*a71a9546SAutomerger Merge Worker
CHECKSUM_save(const void * ip,const struct xt_entry_target * target)52*a71a9546SAutomerger Merge Worker static void CHECKSUM_save(const void *ip, const struct xt_entry_target *target)
53*a71a9546SAutomerger Merge Worker {
54*a71a9546SAutomerger Merge Worker const struct xt_CHECKSUM_info *einfo =
55*a71a9546SAutomerger Merge Worker (const struct xt_CHECKSUM_info *)target->data;
56*a71a9546SAutomerger Merge Worker
57*a71a9546SAutomerger Merge Worker if (einfo->operation & XT_CHECKSUM_OP_FILL)
58*a71a9546SAutomerger Merge Worker printf(" --checksum-fill");
59*a71a9546SAutomerger Merge Worker }
60*a71a9546SAutomerger Merge Worker
61*a71a9546SAutomerger Merge Worker static struct xtables_target checksum_tg_reg = {
62*a71a9546SAutomerger Merge Worker .name = "CHECKSUM",
63*a71a9546SAutomerger Merge Worker .version = XTABLES_VERSION,
64*a71a9546SAutomerger Merge Worker .family = NFPROTO_UNSPEC,
65*a71a9546SAutomerger Merge Worker .size = XT_ALIGN(sizeof(struct xt_CHECKSUM_info)),
66*a71a9546SAutomerger Merge Worker .userspacesize = XT_ALIGN(sizeof(struct xt_CHECKSUM_info)),
67*a71a9546SAutomerger Merge Worker .help = CHECKSUM_help,
68*a71a9546SAutomerger Merge Worker .print = CHECKSUM_print,
69*a71a9546SAutomerger Merge Worker .save = CHECKSUM_save,
70*a71a9546SAutomerger Merge Worker .x6_parse = CHECKSUM_parse,
71*a71a9546SAutomerger Merge Worker .x6_options = CHECKSUM_opts,
72*a71a9546SAutomerger Merge Worker };
73*a71a9546SAutomerger Merge Worker
_init(void)74*a71a9546SAutomerger Merge Worker void _init(void)
75*a71a9546SAutomerger Merge Worker {
76*a71a9546SAutomerger Merge Worker xtables_register_target(&checksum_tg_reg);
77*a71a9546SAutomerger Merge Worker }
78