📄 udp.c.os2_6.patch
字号:
--- plain26/net/ipv4/udp.c.orig 2006-01-02 22:21:10.000000000 -0500+++ plain26/net/ipv4/udp.c 2006-01-10 20:07:21.000000000 -0500@@ -108,11 +108,14 @@ #include <net/inet_common.h> #include <net/checksum.h> #include <net/xfrm.h>+#include <net/xfrmudp.h> /* * Snmp MIB for the UDP layer */ +static xfrm4_rcv_encap_t xfrm4_rcv_encap_func;+ DEFINE_SNMP_STAT(struct udp_mib, udp_statistics) __read_mostly; struct hlist_head udp_hash[UDP_HTABLE_SIZE];@@ -894,6 +897,42 @@ sk_common_release(sk); } +#if defined(CONFIG_XFRM) || defined(CONFIG_IPSEC_NAT_TRAVERSAL)++/* if XFRM isn't a module, then register it directly. */+#if 0 && !defined(CONFIG_XFRM_MODULE) && !defined(CONFIG_IPSEC_NAT_TRAVERSAL)+static xfrm4_rcv_encap_t xfrm4_rcv_encap_func = xfrm4_rcv_encap;+#else+static xfrm4_rcv_encap_t xfrm4_rcv_encap_func = NULL;+#endif++int udp4_register_esp_rcvencap(xfrm4_rcv_encap_t func+ , xfrm4_rcv_encap_t *oldfunc)+{+ if(oldfunc != NULL) {+ *oldfunc = xfrm4_rcv_encap_func;+ }++#if 0+ if(xfrm4_rcv_encap_func != NULL)+ return -1;+#endif++ xfrm4_rcv_encap_func = func;+ return 0;+}++int udp4_unregister_esp_rcvencap(xfrm4_rcv_encap_t func)+{+ if(xfrm4_rcv_encap_func != func)+ return -1;++ xfrm4_rcv_encap_func = NULL;+ return 0;+}+#endif /* CONFIG_XFRM_MODULE || CONFIG_IPSEC_NAT_TRAVERSAL */++ /* return: * 1 if the the UDP system should process it * 0 if we should drop this packet@@ -901,9 +940,9 @@ */ static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb) {-#ifndef CONFIG_XFRM+#if !defined(CONFIG_XFRM) && !defined(CONFIG_IPSEC_NAT_TRAVERSAL) return 1; -#else+#else /* either CONFIG_XFRM or CONFIG_IPSEC_NAT_TRAVERSAL */ struct udp_sock *up = udp_sk(sk); struct udphdr *uh = skb->h.uh; struct iphdr *iph;@@ -915,11 +954,11 @@ /* if we're overly short, let UDP handle it */ if (udpdata > skb->tail)- return 1;+ return 2; /* if this is not encapsulated socket, then just return now */ if (!encap_type)- return 1;+ return 3; len = skb->tail - udpdata; @@ -934,7 +973,7 @@ len = sizeof(struct udphdr); } else /* Must be an IKE packet.. pass it through */- return 1;+ return 4; break; case UDP_ENCAP_ESPINUDP_NON_IKE: /* Check if this is a keepalive packet. If so, eat it. */@@ -947,7 +986,7 @@ len = sizeof(struct udphdr) + 2 * sizeof(u32); } else /* Must be an IKE packet.. pass it through */- return 1;+ return 5; break; } @@ -1021,10 +1060,14 @@ return 0; } if (ret < 0) {- /* process the ESP packet */- ret = xfrm4_rcv_encap(skb, up->encap_type);- UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS);- return -ret;+ if(xfrm4_rcv_encap_func != NULL) {+ ret = (*xfrm4_rcv_encap_func)(skb, up->encap_type);+ UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS);+ } else {+ UDP_INC_STATS_BH(UDP_MIB_INERRORS);+ ret = 1;+ }+ return ret; } /* FALLTHROUGH -- it's a UDP Packet */ }@@ -1114,7 +1157,6 @@ /* * All we need to do is get the socket, and then do a checksum. */- int udp_rcv(struct sk_buff *skb) { struct sock *sk;@@ -1571,3 +1613,9 @@ EXPORT_SYMBOL(udp_proc_register); EXPORT_SYMBOL(udp_proc_unregister); #endif++#if defined(CONFIG_IPSEC_NAT_TRAVERSAL)+EXPORT_SYMBOL(udp4_register_esp_rcvencap);+EXPORT_SYMBOL(udp4_unregister_esp_rcvencap);+#endif+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -