ipv6: Store Router Alert option in IP6CB directly.
Subsystems (3)
PATCH 7/7 ipv6: Store Router Alert option in IP6CB directly.
Router Alert option is very small and we can store the value itself in the skb.
Signed-off-by YOSHIFUJI Hideaki <[email protected]>
--- include/linux/ipv6.h | 3 ++- include/uapi/linux/ipv6.h | 2 ++ net/ipv6/exthdrs.c | 3 ++- net/ipv6/ip6_input.c | 5 ++--- 4 files changed, 8 insertions(+), 5 deletions(-)
include/linux/ipv6.h +2 -1
@@ -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;
@@ -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))
include/uapi/linux/ipv6.h +2 -0
@@ -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)
net/ipv6/exthdrs.c +2 -1
@@ -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",
net/ipv6/ip6_input.c +2 -3
@@ -280,9 +280,8 @@ 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;
@@ -290,7 +289,7 @@ int ip6_mc_input(struct sk_buff *skb)/* 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)) {
Signature · 1 line
1.7.9.5