Skip to content

Commit

Permalink
[SOCK]: Introduce sk_receive_skb
Browse files Browse the repository at this point in the history
Its common enough to to justify that, TCP still can't use it as it has the
prequeueing stuff, still to be made generic in the not so distant future :-)

Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Arnaldo Carvalho de Melo authored and David S. Miller committed Jan 3, 2006
1 parent ce1d4d3 commit 25995ff
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 73 deletions.
22 changes: 2 additions & 20 deletions drivers/net/pppoe.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,8 +383,6 @@ static int pppoe_rcv(struct sk_buff *skb,
{
struct pppoe_hdr *ph;
struct pppox_sock *po;
struct sock *sk;
int ret;

if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr)))
goto drop;
Expand All @@ -395,24 +393,8 @@ static int pppoe_rcv(struct sk_buff *skb,
ph = (struct pppoe_hdr *) skb->nh.raw;

po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source);
if (!po)
goto drop;

sk = sk_pppox(po);
bh_lock_sock(sk);

/* Socket state is unknown, must put skb into backlog. */
if (sock_owned_by_user(sk) != 0) {
sk_add_backlog(sk, skb);
ret = NET_RX_SUCCESS;
} else {
ret = pppoe_rcv_core(sk, skb);
}

bh_unlock_sock(sk);
sock_put(sk);

return ret;
if (po != NULL)
return sk_receive_skb(sk_pppox(po), skb);
drop:
kfree_skb(skb);
out:
Expand Down
23 changes: 23 additions & 0 deletions include/net/sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -926,6 +926,29 @@ static inline void sock_put(struct sock *sk)
sk_free(sk);
}

static inline int sk_receive_skb(struct sock *sk, struct sk_buff *skb)
{
int rc = NET_RX_SUCCESS;

if (sk_filter(sk, skb, 0))
goto discard_and_relse;

skb->dev = NULL;

bh_lock_sock(sk);
if (!sock_owned_by_user(sk))
rc = sk->sk_backlog_rcv(sk, skb);
else
sk_add_backlog(sk, skb);
bh_unlock_sock(sk);
out:
sock_put(sk);
return rc;
discard_and_relse:
kfree_skb(skb);
goto out;
}

/* Detach socket from process context.
* Announce socket dead, detach it from wait queue and inode.
* Note that parent inode held reference count on this struct sock,
Expand Down
23 changes: 2 additions & 21 deletions net/dccp/ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -914,7 +914,6 @@ int dccp_v4_rcv(struct sk_buff *skb)
{
const struct dccp_hdr *dh;
struct sock *sk;
int rc;

/* Step 1: Check header basics: */

Expand Down Expand Up @@ -984,28 +983,10 @@ int dccp_v4_rcv(struct sk_buff *skb)
goto do_time_wait;
}

if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) {
dccp_pr_debug("xfrm4_policy_check failed\n");
if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb))
goto discard_and_relse;
}

if (sk_filter(sk, skb, 0)) {
dccp_pr_debug("sk_filter failed\n");
goto discard_and_relse;
}

skb->dev = NULL;

bh_lock_sock(sk);
rc = 0;
if (!sock_owned_by_user(sk))
rc = dccp_v4_do_rcv(sk, skb);
else
sk_add_backlog(sk, skb);
bh_unlock_sock(sk);

sock_put(sk);
return rc;
return sk_receive_skb(sk, skb);

no_dccp_socket:
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
Expand Down
17 changes: 1 addition & 16 deletions net/dccp/ipv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -1032,7 +1032,6 @@ static int dccp_v6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
const struct dccp_hdr *dh;
struct sk_buff *skb = *pskb;
struct sock *sk;
int rc;

/* Step 1: Check header basics: */

Expand Down Expand Up @@ -1077,21 +1076,7 @@ static int dccp_v6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
goto discard_and_relse;

if (sk_filter(sk, skb, 0))
goto discard_and_relse;

skb->dev = NULL;

bh_lock_sock(sk);
rc = 0;
if (!sock_owned_by_user(sk))
rc = dccp_v6_do_rcv(sk, skb);
else
sk_add_backlog(sk, skb);
bh_unlock_sock(sk);

sock_put(sk);
return rc ? -1 : 0;
return sk_receive_skb(sk, skb) ? -1 : 0;

no_dccp_socket:
if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
Expand Down
17 changes: 1 addition & 16 deletions net/decnet/dn_nsp_in.c
Original file line number Diff line number Diff line change
Expand Up @@ -793,7 +793,6 @@ static int dn_nsp_rx_packet(struct sk_buff *skb)
got_it:
if (sk != NULL) {
struct dn_scp *scp = DN_SK(sk);
int ret;

/* Reset backoff */
scp->nsp_rxtshift = 0;
Expand All @@ -807,21 +806,7 @@ static int dn_nsp_rx_packet(struct sk_buff *skb)
goto free_out;
}

bh_lock_sock(sk);
ret = NET_RX_SUCCESS;
if (decnet_debug_level & 8)
printk(KERN_DEBUG "NSP: 0x%02x 0x%02x 0x%04x 0x%04x %d\n",
(int)cb->rt_flags, (int)cb->nsp_flags,
(int)cb->src_port, (int)cb->dst_port,
!!sock_owned_by_user(sk));
if (!sock_owned_by_user(sk))
ret = dn_nsp_backlog_rcv(sk, skb);
else
sk_add_backlog(sk, skb);
bh_unlock_sock(sk);
sock_put(sk);

return ret;
return sk_receive_skb(sk, skb);
}

return dn_nsp_no_socket(skb, reason);
Expand Down

0 comments on commit 25995ff

Please sign in to comment.