Lines Matching refs:skb

62 	bool	(*func)(struct sk_buff *skb, int offset);
71 static bool ip6_tlvopt_unknown(struct sk_buff *skb, int optoff) in ip6_tlvopt_unknown() argument
73 switch ((skb_network_header(skb)[optoff] & 0xC0) >> 6) { in ip6_tlvopt_unknown()
84 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) in ip6_tlvopt_unknown()
87 icmpv6_param_prob(skb, ICMPV6_UNK_OPTION, optoff); in ip6_tlvopt_unknown()
91 kfree_skb(skb); in ip6_tlvopt_unknown()
97 static bool ip6_parse_tlv(const struct tlvtype_proc *procs, struct sk_buff *skb) in ip6_parse_tlv() argument
100 const unsigned char *nh = skb_network_header(skb); in ip6_parse_tlv()
101 int off = skb_network_header_len(skb); in ip6_parse_tlv()
102 int len = (skb_transport_header(skb)[1] + 1) << 3; in ip6_parse_tlv()
105 if (skb_transport_offset(skb) + len > skb_headlen(skb)) in ip6_parse_tlv()
150 if (curr->func(skb, off) == false) in ip6_parse_tlv()
156 if (ip6_tlvopt_unknown(skb, off) == 0) in ip6_parse_tlv()
169 kfree_skb(skb); in ip6_parse_tlv()
178 static bool ipv6_dest_hao(struct sk_buff *skb, int optoff) in ipv6_dest_hao() argument
181 struct inet6_skb_parm *opt = IP6CB(skb); in ipv6_dest_hao()
182 struct ipv6hdr *ipv6h = ipv6_hdr(skb); in ipv6_dest_hao()
193 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) + optoff); in ipv6_dest_hao()
207 ret = xfrm6_input_addr(skb, (xfrm_address_t *)&ipv6h->daddr, in ipv6_dest_hao()
212 if (skb_cloned(skb)) { in ipv6_dest_hao()
213 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) in ipv6_dest_hao()
217 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) + in ipv6_dest_hao()
219 ipv6h = ipv6_hdr(skb); in ipv6_dest_hao()
222 if (skb->ip_summed == CHECKSUM_COMPLETE) in ipv6_dest_hao()
223 skb->ip_summed = CHECKSUM_NONE; in ipv6_dest_hao()
229 if (skb->tstamp.tv64 == 0) in ipv6_dest_hao()
230 __net_timestamp(skb); in ipv6_dest_hao()
235 kfree_skb(skb); in ipv6_dest_hao()
250 static int ipv6_destopt_rcv(struct sk_buff *skb) in ipv6_destopt_rcv() argument
252 struct inet6_skb_parm *opt = IP6CB(skb); in ipv6_destopt_rcv()
256 struct dst_entry *dst = skb_dst(skb); in ipv6_destopt_rcv()
258 if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || in ipv6_destopt_rcv()
259 !pskb_may_pull(skb, (skb_transport_offset(skb) + in ipv6_destopt_rcv()
260 ((skb_transport_header(skb)[1] + 1) << 3)))) { in ipv6_destopt_rcv()
263 kfree_skb(skb); in ipv6_destopt_rcv()
267 opt->lastopt = opt->dst1 = skb_network_header_len(skb); in ipv6_destopt_rcv()
272 if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) { in ipv6_destopt_rcv()
273 skb->transport_header += (skb_transport_header(skb)[1] + 1) << 3; in ipv6_destopt_rcv()
274 opt = IP6CB(skb); in ipv6_destopt_rcv()
293 static int ipv6_rthdr_rcv(struct sk_buff *skb) in ipv6_rthdr_rcv() argument
295 struct inet6_skb_parm *opt = IP6CB(skb); in ipv6_rthdr_rcv()
302 struct net *net = dev_net(skb->dev); in ipv6_rthdr_rcv()
305 idev = __in6_dev_get(skb->dev); in ipv6_rthdr_rcv()
309 if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || in ipv6_rthdr_rcv()
310 !pskb_may_pull(skb, (skb_transport_offset(skb) + in ipv6_rthdr_rcv()
311 ((skb_transport_header(skb)[1] + 1) << 3)))) { in ipv6_rthdr_rcv()
312 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
314 kfree_skb(skb); in ipv6_rthdr_rcv()
318 hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb); in ipv6_rthdr_rcv()
320 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) || in ipv6_rthdr_rcv()
321 skb->pkt_type != PACKET_HOST) { in ipv6_rthdr_rcv()
322 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
324 kfree_skb(skb); in ipv6_rthdr_rcv()
337 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
339 kfree_skb(skb); in ipv6_rthdr_rcv()
348 opt->lastopt = opt->srcrt = skb_network_header_len(skb); in ipv6_rthdr_rcv()
349 skb->transport_header += (hdr->hdrlen + 1) << 3; in ipv6_rthdr_rcv()
352 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb); in ipv6_rthdr_rcv()
363 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
365 kfree_skb(skb); in ipv6_rthdr_rcv()
382 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
384 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, in ipv6_rthdr_rcv()
386 skb_network_header(skb))); in ipv6_rthdr_rcv()
393 if (skb_cloned(skb)) { in ipv6_rthdr_rcv()
395 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { in ipv6_rthdr_rcv()
396 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
398 kfree_skb(skb); in ipv6_rthdr_rcv()
401 hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb); in ipv6_rthdr_rcv()
404 if (skb->ip_summed == CHECKSUM_COMPLETE) in ipv6_rthdr_rcv()
405 skb->ip_summed = CHECKSUM_NONE; in ipv6_rthdr_rcv()
416 if (xfrm6_input_addr(skb, (xfrm_address_t *)addr, in ipv6_rthdr_rcv()
417 (xfrm_address_t *)&ipv6_hdr(skb)->saddr, in ipv6_rthdr_rcv()
419 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
421 kfree_skb(skb); in ipv6_rthdr_rcv()
424 if (!ipv6_chk_home_addr(dev_net(skb_dst(skb)->dev), addr)) { in ipv6_rthdr_rcv()
425 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
427 kfree_skb(skb); in ipv6_rthdr_rcv()
437 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
439 kfree_skb(skb); in ipv6_rthdr_rcv()
444 *addr = ipv6_hdr(skb)->daddr; in ipv6_rthdr_rcv()
445 ipv6_hdr(skb)->daddr = daddr; in ipv6_rthdr_rcv()
447 skb_dst_drop(skb); in ipv6_rthdr_rcv()
448 ip6_route_input(skb); in ipv6_rthdr_rcv()
449 if (skb_dst(skb)->error) { in ipv6_rthdr_rcv()
450 skb_push(skb, skb->data - skb_network_header(skb)); in ipv6_rthdr_rcv()
451 dst_input(skb); in ipv6_rthdr_rcv()
455 if (skb_dst(skb)->dev->flags&IFF_LOOPBACK) { in ipv6_rthdr_rcv()
456 if (ipv6_hdr(skb)->hop_limit <= 1) { in ipv6_rthdr_rcv()
457 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
459 icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, in ipv6_rthdr_rcv()
461 kfree_skb(skb); in ipv6_rthdr_rcv()
464 ipv6_hdr(skb)->hop_limit--; in ipv6_rthdr_rcv()
468 skb_push(skb, skb->data - skb_network_header(skb)); in ipv6_rthdr_rcv()
469 dst_input(skb); in ipv6_rthdr_rcv()
473 IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_INHDRERRORS); in ipv6_rthdr_rcv()
474 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, in ipv6_rthdr_rcv()
475 (&hdr->type) - skb_network_header(skb)); in ipv6_rthdr_rcv()
533 static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb) in ipv6_skb_idev() argument
535 return skb_dst(skb) ? ip6_dst_idev(skb_dst(skb)) : __in6_dev_get(skb->dev); in ipv6_skb_idev()
538 static inline struct net *ipv6_skb_net(struct sk_buff *skb) in ipv6_skb_net() argument
540 return skb_dst(skb) ? dev_net(skb_dst(skb)->dev) : dev_net(skb->dev); in ipv6_skb_net()
545 static bool ipv6_hop_ra(struct sk_buff *skb, int optoff) in ipv6_hop_ra() argument
547 const unsigned char *nh = skb_network_header(skb); in ipv6_hop_ra()
550 IP6CB(skb)->flags |= IP6SKB_ROUTERALERT; in ipv6_hop_ra()
551 memcpy(&IP6CB(skb)->ra, nh + optoff + 2, sizeof(IP6CB(skb)->ra)); in ipv6_hop_ra()
556 kfree_skb(skb); in ipv6_hop_ra()
562 static bool ipv6_hop_jumbo(struct sk_buff *skb, int optoff) in ipv6_hop_jumbo() argument
564 const unsigned char *nh = skb_network_header(skb); in ipv6_hop_jumbo()
565 struct net *net = ipv6_skb_net(skb); in ipv6_hop_jumbo()
571 IP6_INC_STATS_BH(net, ipv6_skb_idev(skb), in ipv6_hop_jumbo()
578 IP6_INC_STATS_BH(net, ipv6_skb_idev(skb), in ipv6_hop_jumbo()
580 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2); in ipv6_hop_jumbo()
583 if (ipv6_hdr(skb)->payload_len) { in ipv6_hop_jumbo()
584 IP6_INC_STATS_BH(net, ipv6_skb_idev(skb), in ipv6_hop_jumbo()
586 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff); in ipv6_hop_jumbo()
590 if (pkt_len > skb->len - sizeof(struct ipv6hdr)) { in ipv6_hop_jumbo()
591 IP6_INC_STATS_BH(net, ipv6_skb_idev(skb), in ipv6_hop_jumbo()
596 if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr))) in ipv6_hop_jumbo()
602 kfree_skb(skb); in ipv6_hop_jumbo()
618 int ipv6_parse_hopopts(struct sk_buff *skb) in ipv6_parse_hopopts() argument
620 struct inet6_skb_parm *opt = IP6CB(skb); in ipv6_parse_hopopts()
628 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + 8) || in ipv6_parse_hopopts()
629 !pskb_may_pull(skb, (sizeof(struct ipv6hdr) + in ipv6_parse_hopopts()
630 ((skb_transport_header(skb)[1] + 1) << 3)))) { in ipv6_parse_hopopts()
631 kfree_skb(skb); in ipv6_parse_hopopts()
636 if (ip6_parse_tlv(tlvprochopopt_lst, skb)) { in ipv6_parse_hopopts()
637 skb->transport_header += (skb_transport_header(skb)[1] + 1) << 3; in ipv6_parse_hopopts()
638 opt = IP6CB(skb); in ipv6_parse_hopopts()
655 static void ipv6_push_rthdr(struct sk_buff *skb, u8 *proto, in ipv6_push_rthdr() argument
664 phdr = (struct rt0_hdr *) skb_push(skb, (ihdr->rt_hdr.hdrlen + 1) << 3); in ipv6_push_rthdr()
680 static void ipv6_push_exthdr(struct sk_buff *skb, u8 *proto, u8 type, struct ipv6_opt_hdr *opt) in ipv6_push_exthdr() argument
682 struct ipv6_opt_hdr *h = (struct ipv6_opt_hdr *)skb_push(skb, ipv6_optlen(opt)); in ipv6_push_exthdr()
689 void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, in ipv6_push_nfrag_opts() argument
694 ipv6_push_rthdr(skb, proto, opt->srcrt, daddr); in ipv6_push_nfrag_opts()
700 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst0opt); in ipv6_push_nfrag_opts()
703 ipv6_push_exthdr(skb, proto, NEXTHDR_HOP, opt->hopopt); in ipv6_push_nfrag_opts()
707 void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, u8 *proto) in ipv6_push_frag_opts() argument
710 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst1opt); in ipv6_push_frag_opts()