Skip to content

Commit

Permalink
ipv6: Store Router Alert option in IP6CB directly.
Browse files Browse the repository at this point in the history
Router Alert option is very small and we can store the value
itself in the skb.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
YOSHIFUJI Hideaki / 吉藤英明 authored and David S. Miller committed Jan 14, 2013
1 parent 2b464f6 commit dd3332b
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 5 deletions.
3 changes: 2 additions & 1 deletion include/linux/ipv6.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)

struct inet6_skb_parm {
int iif;
__u16 ra;
__be16 ra;
__u16 hop;
__u16 dst0;
__u16 srcrt;
Expand All @@ -100,6 +100,7 @@ struct inet6_skb_parm {
#define IP6SKB_XFRM_TRANSFORMED 1
#define IP6SKB_FORWARDED 2
#define IP6SKB_REROUTED 4
#define IP6SKB_ROUTERALERT 8
};

#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb))
Expand Down
2 changes: 2 additions & 0 deletions include/uapi/linux/ipv6.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ struct ipv6_opt_hdr {
#define ipv6_destopt_hdr ipv6_opt_hdr
#define ipv6_hopopt_hdr ipv6_opt_hdr

/* Router Alert option values (RFC2711) */
#define IPV6_OPT_ROUTERALERT_MLD 0x0000 /* MLD(RFC2710) */

/*
* routing header type 0 (used in cmsghdr struct)
Expand Down
3 changes: 2 additions & 1 deletion net/ipv6/exthdrs.c
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,8 @@ static bool ipv6_hop_ra(struct sk_buff *skb, int optoff)
const unsigned char *nh = skb_network_header(skb);

if (nh[optoff + 1] == 2) {
IP6CB(skb)->ra = optoff;
IP6CB(skb)->flags |= IP6SKB_ROUTERALERT;
memcpy(&IP6CB(skb)->ra, nh + optoff + 2, sizeof(IP6CB(skb)->ra));
return true;
}
LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n",
Expand Down
5 changes: 2 additions & 3 deletions net/ipv6/ip6_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,17 +280,16 @@ int ip6_mc_input(struct sk_buff *skb)
struct inet6_skb_parm *opt = IP6CB(skb);

/* Check for MLD */
if (unlikely(opt->ra)) {
if (unlikely(opt->flags & IP6SKB_ROUTERALERT)) {
/* Check if this is a mld message */
u8 *ptr = skb_network_header(skb) + opt->ra;
u8 nexthdr = hdr->nexthdr;
__be16 frag_off;
int offset;

/* Check if the value of Router Alert
* is for MLD (0x0000).
*/
if ((ptr[2] | ptr[3]) == 0) {
if (opt->ra == htons(IPV6_OPT_ROUTERALERT_MLD)) {
deliver = false;

if (!ipv6_ext_hdr(nexthdr)) {
Expand Down

0 comments on commit dd3332b

Please sign in to comment.