cregit-Linux how code gets into the kernel

Release 4.7 net/ipv4/netfilter/ipt_ECN.c

/* iptables module for the IPv4 and TCP ECN bits, Version 1.5
 *
 * (C) 2002 by Harald Welte <laforge@netfilter.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/in.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <net/ip.h>
#include <linux/tcp.h>
#include <net/checksum.h>

#include <linux/netfilter/x_tables.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ipt_ECN.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
MODULE_DESCRIPTION("Xtables: Explicit Congestion Notification (ECN) flag modification");

/* set ECT codepoint from IP header.
 *      return false if there was an error. */

static inline bool set_ect_ip(struct sk_buff *skb, const struct ipt_ECN_info *einfo) { struct iphdr *iph = ip_hdr(skb); if ((iph->tos & IPT_ECN_IP_MASK) != (einfo->ip_ect & IPT_ECN_IP_MASK)) { __u8 oldtos; if (!skb_make_writable(skb, sizeof(struct iphdr))) return false; iph = ip_hdr(skb); oldtos = iph->tos; iph->tos &= ~IPT_ECN_IP_MASK; iph->tos |= (einfo->ip_ect & IPT_ECN_IP_MASK); csum_replace2(&iph->check, htons(oldtos), htons(iph->tos)); } return true; }

Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte7157.72%220.00%
patrick mchardypatrick mchardy2520.33%330.00%
rusty russellrusty russell86.50%110.00%
al viroal viro64.88%110.00%
arnaldo carvalho de meloarnaldo carvalho de melo64.88%110.00%
herbert xuherbert xu43.25%110.00%
jan engelhardtjan engelhardt32.44%110.00%
Total123100.00%10100.00%

/* Return false if there was an error. */
static inline bool set_ect_tcp(struct sk_buff *skb, const struct ipt_ECN_info *einfo) { struct tcphdr _tcph, *tcph; __be16 oldval; /* Not enough header? */ tcph = skb_header_pointer(skb, ip_hdrlen(skb), sizeof(_tcph), &_tcph); if (!tcph) return false; if ((!(einfo->operation & IPT_ECN_OP_SET_ECE) || tcph->ece == einfo->proto.tcp.ece) && (!(einfo->operation & IPT_ECN_OP_SET_CWR) || tcph->cwr == einfo->proto.tcp.cwr)) return true; if (!skb_make_writable(skb, ip_hdrlen(skb) + sizeof(*tcph))) return false; tcph = (void *)ip_hdr(skb) + ip_hdrlen(skb); oldval = ((__be16 *)tcph)[6]; if (einfo->operation & IPT_ECN_OP_SET_ECE) tcph->ece = einfo->proto.tcp.ece; if (einfo->operation & IPT_ECN_OP_SET_CWR) tcph->cwr = einfo->proto.tcp.cwr; inet_proto_csum_replace2(&tcph->check, skb, oldval, ((__be16 *)tcph)[6], false); return true; }

Contributors

PersonTokensPropCommitsCommitProp
rusty russellrusty russell8838.77%211.76%
harald welteharald welte7231.72%211.76%
patrick mchardypatrick mchardy167.05%317.65%
david s. millerdavid s. miller156.61%15.88%
arnaldo carvalho de meloarnaldo carvalho de melo125.29%211.76%
herbert xuherbert xu83.52%15.88%
al viroal viro62.64%211.76%
jan engelhardtjan engelhardt52.20%15.88%
james morrisjames morris31.32%15.88%
andre goddard rosaandre goddard rosa10.44%15.88%
tom herberttom herbert10.44%15.88%
Total227100.00%17100.00%


static unsigned int ecn_tg(struct sk_buff *skb, const struct xt_action_param *par) { const struct ipt_ECN_info *einfo = par->targinfo; if (einfo->operation & IPT_ECN_OP_SET_IP) if (!set_ect_ip(skb, einfo)) return NF_DROP; if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) && ip_hdr(skb)->protocol == IPPROTO_TCP) if (!set_ect_tcp(skb, einfo)) return NF_DROP; return XT_CONTINUE; }

Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte5968.60%112.50%
rusty russellrusty russell1416.28%112.50%
jan engelhardtjan engelhardt66.98%450.00%
herbert xuherbert xu44.65%112.50%
arnaldo carvalho de meloarnaldo carvalho de melo33.49%112.50%
Total86100.00%8100.00%


static int ecn_tg_check(const struct xt_tgchk_param *par) { const struct ipt_ECN_info *einfo = par->targinfo; const struct ipt_entry *e = par->entryinfo; if (einfo->operation & IPT_ECN_OP_MASK) { pr_info("unsupported ECN operation %x\n", einfo->operation); return -EINVAL; } if (einfo->ip_ect & ~IPT_ECN_IP_MASK) { pr_info("new ECT codepoint %x out of mask\n", einfo->ip_ect); return -EINVAL; } if ((einfo->operation & (IPT_ECN_OP_SET_ECE|IPT_ECN_OP_SET_CWR)) && (e->ip.proto != IPPROTO_TCP || (e->ip.invflags & XT_INV_PROTO))) { pr_info("cannot use TCP operations on a non-tcp rule\n"); return -EINVAL; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte9171.65%220.00%
jan engelhardtjan engelhardt2318.11%660.00%
rusty russellrusty russell118.66%110.00%
patrick mchardypatrick mchardy21.57%110.00%
Total127100.00%10100.00%

static struct xt_target ecn_tg_reg __read_mostly = { .name = "ECN", .family = NFPROTO_IPV4, .target = ecn_tg, .targetsize = sizeof(struct ipt_ECN_info), .table = "mangle", .checkentry = ecn_tg_check, .me = THIS_MODULE, };
static int __init ecn_tg_init(void) { return xt_register_target(&ecn_tg_reg); }

Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte1275.00%125.00%
jan engelhardtjan engelhardt318.75%250.00%
daniele belluccidaniele bellucci16.25%125.00%
Total16100.00%4100.00%


static void __exit ecn_tg_exit(void) { xt_unregister_target(&ecn_tg_reg); }

Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte1280.00%133.33%
jan engelhardtjan engelhardt320.00%266.67%
Total15100.00%3100.00%

module_init(ecn_tg_init); module_exit(ecn_tg_exit);

Overall Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte37052.41%410.53%
rusty russellrusty russell12117.14%37.89%
jan engelhardtjan engelhardt709.92%1128.95%
patrick mchardypatrick mchardy598.36%923.68%
arnaldo carvalho de meloarnaldo carvalho de melo243.40%25.26%
herbert xuherbert xu162.27%12.63%
david s. millerdavid s. miller152.12%12.63%
art haasart haas131.84%12.63%
al viroal viro121.70%25.26%
james morrisjames morris30.42%12.63%
andre goddard rosaandre goddard rosa10.14%12.63%
daniele belluccidaniele bellucci10.14%12.63%
tom herberttom herbert10.14%12.63%
Total706100.00%38100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}