Lines Matching refs:skb
26 static int ipv6_mc_check_ip6hdr(struct sk_buff *skb) in ipv6_mc_check_ip6hdr() argument
30 unsigned int offset = skb_network_offset(skb) + sizeof(*ip6h); in ipv6_mc_check_ip6hdr()
32 if (!pskb_may_pull(skb, offset)) in ipv6_mc_check_ip6hdr()
35 ip6h = ipv6_hdr(skb); in ipv6_mc_check_ip6hdr()
41 if (skb->len < len || len <= offset) in ipv6_mc_check_ip6hdr()
47 static int ipv6_mc_check_exthdrs(struct sk_buff *skb) in ipv6_mc_check_exthdrs() argument
54 ip6h = ipv6_hdr(skb); in ipv6_mc_check_exthdrs()
60 offset = skb_network_offset(skb) + sizeof(*ip6h); in ipv6_mc_check_exthdrs()
61 offset = ipv6_skip_exthdr(skb, offset, &nexthdr, &frag_off); in ipv6_mc_check_exthdrs()
69 skb_set_transport_header(skb, offset); in ipv6_mc_check_exthdrs()
74 static int ipv6_mc_check_mld_reportv2(struct sk_buff *skb) in ipv6_mc_check_mld_reportv2() argument
76 unsigned int len = skb_transport_offset(skb); in ipv6_mc_check_mld_reportv2()
80 return pskb_may_pull(skb, len) ? 0 : -EINVAL; in ipv6_mc_check_mld_reportv2()
83 static int ipv6_mc_check_mld_query(struct sk_buff *skb) in ipv6_mc_check_mld_query() argument
86 unsigned int len = skb_transport_offset(skb); in ipv6_mc_check_mld_query()
89 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) in ipv6_mc_check_mld_query()
93 if (skb->len < len) in ipv6_mc_check_mld_query()
97 if (skb->len != len) { in ipv6_mc_check_mld_query()
100 if (skb->len < len || !pskb_may_pull(skb, len)) in ipv6_mc_check_mld_query()
104 mld = (struct mld_msg *)skb_transport_header(skb); in ipv6_mc_check_mld_query()
110 !ipv6_addr_is_ll_all_nodes(&ipv6_hdr(skb)->daddr)) in ipv6_mc_check_mld_query()
116 static int ipv6_mc_check_mld_msg(struct sk_buff *skb) in ipv6_mc_check_mld_msg() argument
118 struct mld_msg *mld = (struct mld_msg *)skb_transport_header(skb); in ipv6_mc_check_mld_msg()
126 return ipv6_mc_check_mld_reportv2(skb); in ipv6_mc_check_mld_msg()
128 return ipv6_mc_check_mld_query(skb); in ipv6_mc_check_mld_msg()
134 static inline __sum16 ipv6_mc_validate_checksum(struct sk_buff *skb) in ipv6_mc_validate_checksum() argument
136 return skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo); in ipv6_mc_validate_checksum()
139 static int __ipv6_mc_check_mld(struct sk_buff *skb, in __ipv6_mc_check_mld() argument
145 unsigned int len = skb_transport_offset(skb) + sizeof(struct mld_msg); in __ipv6_mc_check_mld()
148 transport_len = ntohs(ipv6_hdr(skb)->payload_len); in __ipv6_mc_check_mld()
149 transport_len -= skb_transport_offset(skb) - sizeof(struct ipv6hdr); in __ipv6_mc_check_mld()
151 skb_chk = skb_checksum_trimmed(skb, transport_len, in __ipv6_mc_check_mld()
166 else if (skb_chk != skb) in __ipv6_mc_check_mld()
172 if (ret && skb_chk && skb_chk != skb) in __ipv6_mc_check_mld()
202 int ipv6_mc_check_mld(struct sk_buff *skb, struct sk_buff **skb_trimmed) in ipv6_mc_check_mld() argument
206 ret = ipv6_mc_check_ip6hdr(skb); in ipv6_mc_check_mld()
210 ret = ipv6_mc_check_exthdrs(skb); in ipv6_mc_check_mld()
214 return __ipv6_mc_check_mld(skb, skb_trimmed); in ipv6_mc_check_mld()