12 #include <linux/slab.h>
13 #include <linux/module.h>
14 #include <linux/string.h>
15 #include <linux/netfilter.h>
16 #include <linux/netfilter_ipv4.h>
25 static inline int xfrm4_rcv_encap_finish(
struct sk_buff *
skb)
27 if (skb_dst(skb) ==
NULL) {
28 const struct iphdr *iph = ip_hdr(skb);
34 return dst_input(skb);
45 return xfrm_input(skb, nexthdr, spi, encap_type);
51 struct iphdr *iph = ip_hdr(skb);
55 #ifndef CONFIG_NETFILTER
60 __skb_push(skb, skb->
data - skb_network_header(skb));
65 xfrm4_rcv_encap_finish);
94 if (!pskb_may_pull(skb,
sizeof(
struct udphdr) +
min(len, 8)))
100 udpdata32 = (
__be32 *)udpdata;
102 switch (encap_type) {
106 if (len == 1 && udpdata[0] == 0xff) {
108 }
else if (len >
sizeof(
struct ip_esp_hdr) && udpdata32[0] != 0) {
110 len =
sizeof(
struct udphdr);
117 if (len == 1 && udpdata[0] == 0xff) {
119 }
else if (len > 2 *
sizeof(
u32) +
sizeof(
struct ip_esp_hdr) &&
120 udpdata32[0] == 0 && udpdata32[1] == 0) {
123 len =
sizeof(
struct udphdr) + 2 *
sizeof(
u32);
140 iphlen = iph->ihl << 2;
142 if (skb->
len < iphlen + len) {
151 __skb_pull(skb, len);
152 skb_reset_transport_header(skb);
164 return xfrm4_rcv_spi(skb, ip_hdr(skb)->
protocol, 0);