linux/net/ipv4/xfrm4_state.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * xfrm4_state.c
   4 *
   5 * Changes:
   6 *      YOSHIFUJI Hideaki @USAGI
   7 *              Split up af-specific portion
   8 *
   9 */
  10
  11#include <net/ip.h>
  12#include <net/xfrm.h>
  13#include <linux/pfkeyv2.h>
  14#include <linux/ipsec.h>
  15#include <linux/netfilter_ipv4.h>
  16#include <linux/export.h>
  17
  18static int xfrm4_init_flags(struct xfrm_state *x)
  19{
  20        if (xs_net(x)->ipv4.sysctl_ip_no_pmtu_disc)
  21                x->props.flags |= XFRM_STATE_NOPMTUDISC;
  22        return 0;
  23}
  24
  25static void
  26__xfrm4_init_tempsel(struct xfrm_selector *sel, const struct flowi *fl)
  27{
  28        const struct flowi4 *fl4 = &fl->u.ip4;
  29
  30        sel->daddr.a4 = fl4->daddr;
  31        sel->saddr.a4 = fl4->saddr;
  32        sel->dport = xfrm_flowi_dport(fl, &fl4->uli);
  33        sel->dport_mask = htons(0xffff);
  34        sel->sport = xfrm_flowi_sport(fl, &fl4->uli);
  35        sel->sport_mask = htons(0xffff);
  36        sel->family = AF_INET;
  37        sel->prefixlen_d = 32;
  38        sel->prefixlen_s = 32;
  39        sel->proto = fl4->flowi4_proto;
  40        sel->ifindex = fl4->flowi4_oif;
  41}
  42
  43static void
  44xfrm4_init_temprop(struct xfrm_state *x, const struct xfrm_tmpl *tmpl,
  45                   const xfrm_address_t *daddr, const xfrm_address_t *saddr)
  46{
  47        x->id = tmpl->id;
  48        if (x->id.daddr.a4 == 0)
  49                x->id.daddr.a4 = daddr->a4;
  50        x->props.saddr = tmpl->saddr;
  51        if (x->props.saddr.a4 == 0)
  52                x->props.saddr.a4 = saddr->a4;
  53        x->props.mode = tmpl->mode;
  54        x->props.reqid = tmpl->reqid;
  55        x->props.family = AF_INET;
  56}
  57
  58int xfrm4_extract_header(struct sk_buff *skb)
  59{
  60        const struct iphdr *iph = ip_hdr(skb);
  61
  62        XFRM_MODE_SKB_CB(skb)->ihl = sizeof(*iph);
  63        XFRM_MODE_SKB_CB(skb)->id = iph->id;
  64        XFRM_MODE_SKB_CB(skb)->frag_off = iph->frag_off;
  65        XFRM_MODE_SKB_CB(skb)->tos = iph->tos;
  66        XFRM_MODE_SKB_CB(skb)->ttl = iph->ttl;
  67        XFRM_MODE_SKB_CB(skb)->optlen = iph->ihl * 4 - sizeof(*iph);
  68        memset(XFRM_MODE_SKB_CB(skb)->flow_lbl, 0,
  69               sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl));
  70
  71        return 0;
  72}
  73
  74static struct xfrm_state_afinfo xfrm4_state_afinfo = {
  75        .family                 = AF_INET,
  76        .proto                  = IPPROTO_IPIP,
  77        .eth_proto              = htons(ETH_P_IP),
  78        .owner                  = THIS_MODULE,
  79        .init_flags             = xfrm4_init_flags,
  80        .init_tempsel           = __xfrm4_init_tempsel,
  81        .init_temprop           = xfrm4_init_temprop,
  82        .output                 = xfrm4_output,
  83        .output_finish          = xfrm4_output_finish,
  84        .extract_input          = xfrm4_extract_input,
  85        .extract_output         = xfrm4_extract_output,
  86        .transport_finish       = xfrm4_transport_finish,
  87        .local_error            = xfrm4_local_error,
  88};
  89
  90void __init xfrm4_state_init(void)
  91{
  92        xfrm_state_register_afinfo(&xfrm4_state_afinfo);
  93}
  94