Loading include/net/protocol.h +1 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ /* This is used to register protocols. */ struct net_protocol { int (*early_demux)(struct sk_buff *skb); void (*early_demux)(struct sk_buff *skb); int (*handler)(struct sk_buff *skb); void (*err_handler)(struct sk_buff *skb, u32 info); int (*gso_send_check)(struct sk_buff *skb); Loading include/net/tcp.h +1 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,7 @@ extern void tcp_v4_err(struct sk_buff *skb, u32); extern void tcp_shutdown (struct sock *sk, int how); extern int tcp_v4_early_demux(struct sk_buff *skb); extern void tcp_v4_early_demux(struct sk_buff *skb); extern int tcp_v4_rcv(struct sk_buff *skb); extern struct inet_peer *tcp_v4_get_peer(struct sock *sk); Loading net/ipv4/ip_input.c +19 −23 Original line number Diff line number Diff line Loading @@ -320,26 +320,23 @@ static int ip_rcv_finish(struct sk_buff *skb) const struct iphdr *iph = ip_hdr(skb); struct rtable *rt; /* * Initialise the virtual path cache for the packet. It describes * how the packet travels inside Linux networking. */ if (skb_dst(skb) == NULL) { int err = -ENOENT; if (sysctl_ip_early_demux) { if (sysctl_ip_early_demux && !skb_dst(skb)) { const struct net_protocol *ipprot; int protocol = iph->protocol; rcu_read_lock(); ipprot = rcu_dereference(inet_protos[protocol]); if (ipprot && ipprot->early_demux) err = ipprot->early_demux(skb); ipprot->early_demux(skb); rcu_read_unlock(); } if (err) { err = ip_route_input_noref(skb, iph->daddr, iph->saddr, /* * Initialise the virtual path cache for the packet. It describes * how the packet travels inside Linux networking. */ if (!skb_dst(skb)) { int err = ip_route_input_noref(skb, iph->daddr, iph->saddr, iph->tos, skb->dev); if (unlikely(err)) { if (err == -EXDEV) Loading @@ -348,7 +345,6 @@ static int ip_rcv_finish(struct sk_buff *skb) goto drop; } } } #ifdef CONFIG_IP_ROUTE_CLASSID if (unlikely(skb_dst(skb)->tclassid)) { Loading net/ipv4/tcp_ipv4.c +6 −13 Original line number Diff line number Diff line Loading @@ -1673,30 +1673,28 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) } EXPORT_SYMBOL(tcp_v4_do_rcv); int tcp_v4_early_demux(struct sk_buff *skb) void tcp_v4_early_demux(struct sk_buff *skb) { struct net *net = dev_net(skb->dev); const struct iphdr *iph; const struct tcphdr *th; struct net_device *dev; struct sock *sk; int err; err = -ENOENT; if (skb->pkt_type != PACKET_HOST) goto out_err; return; if (!pskb_may_pull(skb, ip_hdrlen(skb) + sizeof(struct tcphdr))) goto out_err; return; iph = ip_hdr(skb); th = (struct tcphdr *) ((char *)iph + ip_hdrlen(skb)); if (th->doff < sizeof(struct tcphdr) / 4) goto out_err; return; if (!pskb_may_pull(skb, ip_hdrlen(skb) + th->doff * 4)) goto out_err; return; dev = skb->dev; sk = __inet_lookup_established(net, &tcp_hashinfo, Loading @@ -1713,16 +1711,11 @@ int tcp_v4_early_demux(struct sk_buff *skb) if (dst) { struct rtable *rt = (struct rtable *) dst; if (rt->rt_iif == dev->ifindex) { if (rt->rt_iif == dev->ifindex) skb_dst_set_noref(skb, dst); err = 0; } } } } out_err: return err; } /* Loading Loading
include/net/protocol.h +1 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ /* This is used to register protocols. */ struct net_protocol { int (*early_demux)(struct sk_buff *skb); void (*early_demux)(struct sk_buff *skb); int (*handler)(struct sk_buff *skb); void (*err_handler)(struct sk_buff *skb, u32 info); int (*gso_send_check)(struct sk_buff *skb); Loading
include/net/tcp.h +1 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,7 @@ extern void tcp_v4_err(struct sk_buff *skb, u32); extern void tcp_shutdown (struct sock *sk, int how); extern int tcp_v4_early_demux(struct sk_buff *skb); extern void tcp_v4_early_demux(struct sk_buff *skb); extern int tcp_v4_rcv(struct sk_buff *skb); extern struct inet_peer *tcp_v4_get_peer(struct sock *sk); Loading
net/ipv4/ip_input.c +19 −23 Original line number Diff line number Diff line Loading @@ -320,26 +320,23 @@ static int ip_rcv_finish(struct sk_buff *skb) const struct iphdr *iph = ip_hdr(skb); struct rtable *rt; /* * Initialise the virtual path cache for the packet. It describes * how the packet travels inside Linux networking. */ if (skb_dst(skb) == NULL) { int err = -ENOENT; if (sysctl_ip_early_demux) { if (sysctl_ip_early_demux && !skb_dst(skb)) { const struct net_protocol *ipprot; int protocol = iph->protocol; rcu_read_lock(); ipprot = rcu_dereference(inet_protos[protocol]); if (ipprot && ipprot->early_demux) err = ipprot->early_demux(skb); ipprot->early_demux(skb); rcu_read_unlock(); } if (err) { err = ip_route_input_noref(skb, iph->daddr, iph->saddr, /* * Initialise the virtual path cache for the packet. It describes * how the packet travels inside Linux networking. */ if (!skb_dst(skb)) { int err = ip_route_input_noref(skb, iph->daddr, iph->saddr, iph->tos, skb->dev); if (unlikely(err)) { if (err == -EXDEV) Loading @@ -348,7 +345,6 @@ static int ip_rcv_finish(struct sk_buff *skb) goto drop; } } } #ifdef CONFIG_IP_ROUTE_CLASSID if (unlikely(skb_dst(skb)->tclassid)) { Loading
net/ipv4/tcp_ipv4.c +6 −13 Original line number Diff line number Diff line Loading @@ -1673,30 +1673,28 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) } EXPORT_SYMBOL(tcp_v4_do_rcv); int tcp_v4_early_demux(struct sk_buff *skb) void tcp_v4_early_demux(struct sk_buff *skb) { struct net *net = dev_net(skb->dev); const struct iphdr *iph; const struct tcphdr *th; struct net_device *dev; struct sock *sk; int err; err = -ENOENT; if (skb->pkt_type != PACKET_HOST) goto out_err; return; if (!pskb_may_pull(skb, ip_hdrlen(skb) + sizeof(struct tcphdr))) goto out_err; return; iph = ip_hdr(skb); th = (struct tcphdr *) ((char *)iph + ip_hdrlen(skb)); if (th->doff < sizeof(struct tcphdr) / 4) goto out_err; return; if (!pskb_may_pull(skb, ip_hdrlen(skb) + th->doff * 4)) goto out_err; return; dev = skb->dev; sk = __inet_lookup_established(net, &tcp_hashinfo, Loading @@ -1713,16 +1711,11 @@ int tcp_v4_early_demux(struct sk_buff *skb) if (dst) { struct rtable *rt = (struct rtable *) dst; if (rt->rt_iif == dev->ifindex) { if (rt->rt_iif == dev->ifindex) skb_dst_set_noref(skb, dst); err = 0; } } } } out_err: return err; } /* Loading