Skip to content

Commit

Permalink
udp6: fix UDP/IPv6 encap resubmit path
Browse files Browse the repository at this point in the history
IPv4 interprets a negative return value from a protocol handler as a
request to redispatch to a new protocol.  In contrast, IPv6 interprets a
negative value as an error, and interprets a positive value as a request
for redispatch.

UDP for IPv6 was unaware of this difference.  Change __udp6_lib_rcv() to
return a positive value for redispatch.  Note that the socket's
encap_rcv hook still needs to return a negative value to request
dispatch, and in the case of IPv6 packets, adjust IP6CB(skb)->nhoff to
identify the byte containing the next protocol.

Signed-off-by: Bill Sommerfeld <wsommerfeld@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Bill Sommerfeld authored and David S. Miller committed Mar 7, 2016
1 parent a69bf3c commit 59dca1d
Showing 1 changed file with 2 additions and 4 deletions.
6 changes: 2 additions & 4 deletions net/ipv6/udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -962,11 +962,9 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
ret = udpv6_queue_rcv_skb(sk, skb);
sock_put(sk);

/* a return value > 0 means to resubmit the input, but
* it wants the return to be -protocol, or 0
*/
/* a return value > 0 means to resubmit the input */
if (ret > 0)
return -ret;
return ret;

return 0;
}
Expand Down

0 comments on commit 59dca1d

Please sign in to comment.