cregit-Linux how code gets into the kernel

Release 4.8 net/ipv4/xfrm4_mode_beet.c

Directory: net/ipv4
/*
 * xfrm4_mode_beet.c - BEET mode encapsulation for IPv4.
 *
 * Copyright (c) 2006 Diego Beltrami <diego.beltrami@gmail.com>
 *                    Miika Komu     <miika@iki.fi>
 *                    Herbert Xu     <herbert@gondor.apana.org.au>
 *                    Abhinav Pathak <abhinav.pathak@hiit.fi>
 *                    Jeff Ahrenholz <ahrenholz@gmail.com>
 */

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/stringify.h>
#include <net/dst.h>
#include <net/ip.h>
#include <net/xfrm.h>


static void xfrm4_beet_make_header(struct sk_buff *skb) { struct iphdr *iph = ip_hdr(skb); iph->ihl = 5; iph->version = 4; iph->protocol = XFRM_MODE_SKB_CB(skb)->protocol; iph->tos = XFRM_MODE_SKB_CB(skb)->tos; iph->id = XFRM_MODE_SKB_CB(skb)->id; iph->frag_off = XFRM_MODE_SKB_CB(skb)->frag_off; iph->ttl = XFRM_MODE_SKB_CB(skb)->ttl; }

Contributors

PersonTokensPropCommitsCommitProp
herbert xuherbert xu88100.00%1100.00%
Total88100.00%1100.00%

/* Add encapsulation header. * * The top IP header will be constructed per draft-nikander-esp-beet-mode-06.txt. */
static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb) { struct ip_beet_phdr *ph; struct iphdr *top_iph; int hdrlen, optlen; hdrlen = 0; optlen = XFRM_MODE_SKB_CB(skb)->optlen; if (unlikely(optlen)) hdrlen += IPV4_BEET_PHMAXLEN - (optlen & 4); skb_set_network_header(skb, -x->props.header_len - hdrlen + (XFRM_MODE_SKB_CB(skb)->ihl - sizeof(*top_iph))); if (x->sel.family != AF_INET6) skb->network_header += IPV4_BEET_PHMAXLEN; skb->mac_header = skb->network_header + offsetof(struct iphdr, protocol); skb->transport_header = skb->network_header + sizeof(*top_iph); xfrm4_beet_make_header(skb); ph = (struct ip_beet_phdr *) __skb_pull(skb, XFRM_MODE_SKB_CB(skb)->ihl - hdrlen); top_iph = ip_hdr(skb); if (unlikely(optlen)) { BUG_ON(optlen < 0); ph->padlen = 4 - (optlen & 4); ph->hdrlen = optlen / 8; ph->nexthdr = top_iph->protocol; if (ph->padlen) memset(ph + 1, IPOPT_NOP, ph->padlen); top_iph->protocol = IPPROTO_BEETPH; top_iph->ihl = sizeof(struct iphdr) / 4; } top_iph->saddr = x->props.saddr.a4; top_iph->daddr = x->id.daddr.a4; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
diego beltramidiego beltrami15857.04%19.09%
herbert xuherbert xu6222.38%436.36%
joakim koskelajoakim koskela3111.19%19.09%
patrick mchardypatrick mchardy248.66%327.27%
arnaldo carvalho de meloarnaldo carvalho de melo20.72%218.18%
Total277100.00%11100.00%


static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb) { struct iphdr *iph; int optlen = 0; int err = -EINVAL; if (unlikely(XFRM_MODE_SKB_CB(skb)->protocol == IPPROTO_BEETPH)) { struct ip_beet_phdr *ph; int phlen; if (!pskb_may_pull(skb, sizeof(*ph))) goto out; ph = (struct ip_beet_phdr *)skb->data; phlen = sizeof(*ph) + ph->padlen; optlen = ph->hdrlen * 8 + (IPV4_BEET_PHMAXLEN - phlen); if (optlen < 0 || optlen & 3 || optlen > 250) goto out; XFRM_MODE_SKB_CB(skb)->protocol = ph->nexthdr; if (!pskb_may_pull(skb, phlen)) goto out; __skb_pull(skb, phlen); } skb_push(skb, sizeof(*iph)); skb_reset_network_header(skb); skb_mac_header_rebuild(skb); xfrm4_beet_make_header(skb); iph = ip_hdr(skb); iph->ihl += optlen / 4; iph->tot_len = htons(skb->len); iph->daddr = x->sel.daddr.a4; iph->saddr = x->sel.saddr.a4; iph->check = 0; iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl); err = 0; out: return err; }

Contributors

PersonTokensPropCommitsCommitProp
diego beltramidiego beltrami19071.70%110.00%
herbert xuherbert xu3312.45%110.00%
patrick mchardypatrick mchardy2810.57%330.00%
arnaldo carvalho de meloarnaldo carvalho de melo114.15%330.00%
david s. millerdavid s. miller20.75%110.00%
eric dumazeteric dumazet10.38%110.00%
Total265100.00%10100.00%

static struct xfrm_mode xfrm4_beet_mode = { .input2 = xfrm4_beet_input, .input = xfrm_prepare_input, .output2 = xfrm4_beet_output, .output = xfrm4_prepare_output, .owner = THIS_MODULE, .encap = XFRM_MODE_BEET, .flags = XFRM_MODE_FLAG_TUNNEL, };
static int __init xfrm4_beet_init(void) { return xfrm_register_mode(&xfrm4_beet_mode, AF_INET); }

Contributors

PersonTokensPropCommitsCommitProp
diego beltramidiego beltrami18100.00%1100.00%
Total18100.00%1100.00%


static void __exit xfrm4_beet_exit(void) { int err; err = xfrm_unregister_mode(&xfrm4_beet_mode, AF_INET); BUG_ON(err); }

Contributors

PersonTokensPropCommitsCommitProp
diego beltramidiego beltrami27100.00%1100.00%
Total27100.00%1100.00%

module_init(xfrm4_beet_init); module_exit(xfrm4_beet_exit); MODULE_LICENSE("GPL"); MODULE_ALIAS_XFRM_MODE(AF_INET, XFRM_MODE_BEET);

Overall Contributors

PersonTokensPropCommitsCommitProp
diego beltramidiego beltrami46560.78%14.76%
herbert xuherbert xu20126.27%733.33%
patrick mchardypatrick mchardy526.80%628.57%
joakim koskelajoakim koskela314.05%14.76%
arnaldo carvalho de meloarnaldo carvalho de melo131.70%419.05%
david s. millerdavid s. miller20.26%14.76%
eric dumazeteric dumazet10.13%14.76%
Total765100.00%21100.00%
Directory: net/ipv4
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.