Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 314692
b: refs/heads/master
c: 160eb5a
h: refs/heads/master
v: v3
  • Loading branch information
David S. Miller committed Jun 28, 2012
1 parent 86a210e commit dd10d0f
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 39 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1d1e34ddd48d27def2f324c1e3be16d460b16436
refs/heads/master: 160eb5a6b14ca2eab5c598bdbbb24c24624bad34
2 changes: 1 addition & 1 deletion trunk/include/net/protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion trunk/include/net/tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
42 changes: 19 additions & 23 deletions trunk/net/ipv4/ip_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,33 +320,29 @@ static int ip_rcv_finish(struct sk_buff *skb)
const struct iphdr *iph = ip_hdr(skb);
struct rtable *rt;

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)
ipprot->early_demux(skb);
rcu_read_unlock();
}

/*
* 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) {
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);
rcu_read_unlock();
}

if (err) {
err = ip_route_input_noref(skb, iph->daddr, iph->saddr,
iph->tos, skb->dev);
if (unlikely(err)) {
if (err == -EXDEV)
NET_INC_STATS_BH(dev_net(skb->dev),
LINUX_MIB_IPRPFILTER);
goto drop;
}
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)
NET_INC_STATS_BH(dev_net(skb->dev),
LINUX_MIB_IPRPFILTER);
goto drop;
}
}

Expand Down
19 changes: 6 additions & 13 deletions trunk/net/ipv4/tcp_ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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;
}

/*
Expand Down

0 comments on commit dd10d0f

Please sign in to comment.