libxt_CHECKSUM.c revision f92bca9da4ee68f05dbb827a8444804a8edb1b87
14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/* Shared library add-on to xtables for CHECKSUM 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * (C) 2002 by Harald Welte <laforge@gnumonks.org> 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * (C) 2010 by Red Hat, Inc 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Author: Michael S. Tsirkin <mst@redhat.com> 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * This program is distributed under the terms of GNU GPL v2, 1991 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * libxt_CHECKSUM.c borrowed some bits from libipt_ECN.c 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <stdio.h> 1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <xtables.h> 1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <linux/netfilter/xt_CHECKSUM.h> 1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)enum { 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) O_CHECKSUM_FILL = 0, 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void CHECKSUM_help(void) 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){ 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) printf( 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)"CHECKSUM target options\n" 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)" --checksum-fill Fill in packet checksum.\n"); 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static const struct xt_option_entry CHECKSUM_opts[] = { 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {.name = "checksum-fill", .id = O_CHECKSUM_FILL, 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) .flags = XTOPT_MAND, .type = XTTYPE_NONE}, 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) XTOPT_TABLEEND, 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void CHECKSUM_parse(struct xt_option_call *cb) 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){ 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) struct xt_CHECKSUM_info *einfo = cb->data; 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) xtables_option_parse(cb); 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) einfo->operation = XT_CHECKSUM_OP_FILL; 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void CHECKSUM_print(const void *ip, const struct xt_entry_target *target, 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int numeric) 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){ 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const struct xt_CHECKSUM_info *einfo = 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (const struct xt_CHECKSUM_info *)target->data; 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) printf(" CHECKSUM"); 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (einfo->operation & XT_CHECKSUM_OP_FILL) 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) printf(" fill"); 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static void CHECKSUM_save(const void *ip, const struct xt_entry_target *target) 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){ 54 const struct xt_CHECKSUM_info *einfo = 55 (const struct xt_CHECKSUM_info *)target->data; 56 57 if (einfo->operation & XT_CHECKSUM_OP_FILL) 58 printf(" --checksum-fill"); 59} 60 61static struct xtables_target checksum_tg_reg = { 62 .name = "CHECKSUM", 63 .version = XTABLES_VERSION, 64 .family = NFPROTO_UNSPEC, 65 .size = XT_ALIGN(sizeof(struct xt_CHECKSUM_info)), 66 .userspacesize = XT_ALIGN(sizeof(struct xt_CHECKSUM_info)), 67 .help = CHECKSUM_help, 68 .print = CHECKSUM_print, 69 .save = CHECKSUM_save, 70 .x6_parse = CHECKSUM_parse, 71 .x6_options = CHECKSUM_opts, 72}; 73 74void _init(void) 75{ 76 xtables_register_target(&checksum_tg_reg); 77} 78