So that we can re-use it at the UDP lavel in a later patch

Signed-off-by: Paolo Abeni <pab...@redhat.com>
---
 net/ipv4/ip_input.c | 73 ++++++++++++++++++++++-----------------------
 1 file changed, 36 insertions(+), 37 deletions(-)

diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
index 35a786c0aaa0..72250b4e466d 100644
--- a/net/ipv4/ip_input.c
+++ b/net/ipv4/ip_input.c
@@ -188,51 +188,50 @@ bool ip_call_ra_chain(struct sk_buff *skb)
        return false;
 }
 
-static int ip_local_deliver_finish(struct net *net, struct sock *sk, struct 
sk_buff *skb)
+void ip_protocol_deliver_rcu(struct net *net, struct sk_buff *skb, int 
protocol)
 {
-       __skb_pull(skb, skb_network_header_len(skb));
-
-       rcu_read_lock();
-       {
-               int protocol = ip_hdr(skb)->protocol;
-               const struct net_protocol *ipprot;
-               int raw;
+       const struct net_protocol *ipprot;
+       int raw, ret;
 
-       resubmit:
-               raw = raw_local_deliver(skb, protocol);
+resubmit:
+       raw = raw_local_deliver(skb, protocol);
 
-               ipprot = rcu_dereference(inet_protos[protocol]);
-               if (ipprot) {
-                       int ret;
-
-                       if (!ipprot->no_policy) {
-                               if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, 
skb)) {
-                                       kfree_skb(skb);
-                                       goto out;
-                               }
-                               nf_reset(skb);
+       ipprot = rcu_dereference(inet_protos[protocol]);
+       if (ipprot) {
+               if (!ipprot->no_policy) {
+                       if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
+                               kfree_skb(skb);
+                               return;
                        }
-                       ret = ipprot->handler(skb);
-                       if (ret < 0) {
-                               protocol = -ret;
-                               goto resubmit;
+                       nf_reset(skb);
+               }
+               ret = ipprot->handler(skb);
+               if (ret < 0) {
+                       protocol = -ret;
+                       goto resubmit;
+               }
+               __IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
+       } else {
+               if (!raw) {
+                       if (xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
+                               __IP_INC_STATS(net, 
IPSTATS_MIB_INUNKNOWNPROTOS);
+                               icmp_send(skb, ICMP_DEST_UNREACH,
+                                         ICMP_PROT_UNREACH, 0);
                        }
-                       __IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
+                       kfree_skb(skb);
                } else {
-                       if (!raw) {
-                               if (xfrm4_policy_check(NULL, XFRM_POLICY_IN, 
skb)) {
-                                       __IP_INC_STATS(net, 
IPSTATS_MIB_INUNKNOWNPROTOS);
-                                       icmp_send(skb, ICMP_DEST_UNREACH,
-                                                 ICMP_PROT_UNREACH, 0);
-                               }
-                               kfree_skb(skb);
-                       } else {
-                               __IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
-                               consume_skb(skb);
-                       }
+                       __IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
+                       consume_skb(skb);
                }
        }
- out:
+}
+
+static int ip_local_deliver_finish(struct net *net, struct sock *sk, struct 
sk_buff *skb)
+{
+       __skb_pull(skb, skb_network_header_len(skb));
+
+       rcu_read_lock();
+       ip_protocol_deliver_rcu(net, skb, ip_hdr(skb)->protocol);
        rcu_read_unlock();
 
        return 0;
-- 
2.17.2

Reply via email to