cregit-Linux how code gets into the kernel

Release 4.11 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 Welte7157.72%220.00%
Patrick McHardy2520.33%330.00%
Rusty Russell86.50%110.00%
Al Viro64.88%110.00%
Arnaldo Carvalho de Melo64.88%110.00%
Herbert Xu43.25%110.00%
Jan 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 Russell8838.77%211.76%
Harald Welte7231.72%211.76%
Patrick McHardy167.05%317.65%
David S. Miller156.61%15.88%
Arnaldo Carvalho de Melo125.29%211.76%
Herbert Xu83.52%15.88%
Al Viro62.64%211.76%
Jan Engelhardt52.20%15.88%
James Morris31.32%15.88%
André Goddard Rosa10.44%15.88%
Tom 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 Welte5968.60%112.50%
Rusty Russell1416.28%112.50%
Jan Engelhardt66.98%450.00%
Herbert Xu44.65%112.50%
Arnaldo 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 Welte9171.65%220.00%
Jan Engelhardt2318.11%660.00%
Rusty Russell118.66%110.00%
Patrick 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 Welte1275.00%125.00%
Jan Engelhardt318.75%250.00%
Daniele Bellucci16.25%125.00%
Total16100.00%4100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Harald Welte1280.00%133.33%
Jan Engelhardt320.00%266.67%
Total15100.00%3100.00%

module_init(ecn_tg_init); module_exit(ecn_tg_exit);

Overall Contributors

PersonTokensPropCommitsCommitProp
Harald Welte37052.41%410.53%
Rusty Russell12117.14%37.89%
Jan Engelhardt709.92%1128.95%
Patrick McHardy598.36%923.68%
Arnaldo Carvalho de Melo243.40%25.26%
Herbert Xu162.27%12.63%
David S. Miller152.12%12.63%
Art Haas131.84%12.63%
Al Viro121.70%25.26%
James Morris30.42%12.63%
Tom Herbert10.14%12.63%
André Goddard Rosa10.14%12.63%
Daniele Bellucci10.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.
Created with cregit.