Lines Matching refs:skb

69 			   const struct sk_buff *skb)  in ovs_flow_stats_update()  argument
73 int len = skb->len + (skb_vlan_tag_present(skb) ? VLAN_HLEN : 0); in ovs_flow_stats_update()
180 static int check_header(struct sk_buff *skb, int len) in check_header() argument
182 if (unlikely(skb->len < len)) in check_header()
184 if (unlikely(!pskb_may_pull(skb, len))) in check_header()
189 static bool arphdr_ok(struct sk_buff *skb) in arphdr_ok() argument
191 return pskb_may_pull(skb, skb_network_offset(skb) + in arphdr_ok()
195 static int check_iphdr(struct sk_buff *skb) in check_iphdr() argument
197 unsigned int nh_ofs = skb_network_offset(skb); in check_iphdr()
201 err = check_header(skb, nh_ofs + sizeof(struct iphdr)); in check_iphdr()
205 ip_len = ip_hdrlen(skb); in check_iphdr()
207 skb->len < nh_ofs + ip_len)) in check_iphdr()
210 skb_set_transport_header(skb, nh_ofs + ip_len); in check_iphdr()
214 static bool tcphdr_ok(struct sk_buff *skb) in tcphdr_ok() argument
216 int th_ofs = skb_transport_offset(skb); in tcphdr_ok()
219 if (unlikely(!pskb_may_pull(skb, th_ofs + sizeof(struct tcphdr)))) in tcphdr_ok()
222 tcp_len = tcp_hdrlen(skb); in tcphdr_ok()
224 skb->len < th_ofs + tcp_len)) in tcphdr_ok()
230 static bool udphdr_ok(struct sk_buff *skb) in udphdr_ok() argument
232 return pskb_may_pull(skb, skb_transport_offset(skb) + in udphdr_ok()
236 static bool sctphdr_ok(struct sk_buff *skb) in sctphdr_ok() argument
238 return pskb_may_pull(skb, skb_transport_offset(skb) + in sctphdr_ok()
242 static bool icmphdr_ok(struct sk_buff *skb) in icmphdr_ok() argument
244 return pskb_may_pull(skb, skb_transport_offset(skb) + in icmphdr_ok()
248 static int parse_ipv6hdr(struct sk_buff *skb, struct sw_flow_key *key) in parse_ipv6hdr() argument
250 unsigned int nh_ofs = skb_network_offset(skb); in parse_ipv6hdr()
258 err = check_header(skb, nh_ofs + sizeof(*nh)); in parse_ipv6hdr()
262 nh = ipv6_hdr(skb); in parse_ipv6hdr()
264 payload_ofs = (u8 *)(nh + 1) - skb->data; in parse_ipv6hdr()
273 payload_ofs = ipv6_skip_exthdr(skb, payload_ofs, &nexthdr, &frag_off); in parse_ipv6hdr()
287 skb_set_transport_header(skb, nh_ofs + nh_len); in parse_ipv6hdr()
292 static bool icmp6hdr_ok(struct sk_buff *skb) in icmp6hdr_ok() argument
294 return pskb_may_pull(skb, skb_transport_offset(skb) + in icmp6hdr_ok()
298 static int parse_vlan(struct sk_buff *skb, struct sw_flow_key *key) in parse_vlan() argument
306 if (unlikely(skb->len < sizeof(struct qtag_prefix) + sizeof(__be16))) in parse_vlan()
309 if (unlikely(!pskb_may_pull(skb, sizeof(struct qtag_prefix) + in parse_vlan()
313 qp = (struct qtag_prefix *) skb->data; in parse_vlan()
315 __skb_pull(skb, sizeof(struct qtag_prefix)); in parse_vlan()
320 static __be16 parse_ethertype(struct sk_buff *skb) in parse_ethertype() argument
332 proto = *(__be16 *) skb->data; in parse_ethertype()
333 __skb_pull(skb, sizeof(__be16)); in parse_ethertype()
338 if (skb->len < sizeof(struct llc_snap_hdr)) in parse_ethertype()
341 if (unlikely(!pskb_may_pull(skb, sizeof(struct llc_snap_hdr)))) in parse_ethertype()
344 llc = (struct llc_snap_hdr *) skb->data; in parse_ethertype()
350 __skb_pull(skb, sizeof(struct llc_snap_hdr)); in parse_ethertype()
358 static int parse_icmpv6(struct sk_buff *skb, struct sw_flow_key *key, in parse_icmpv6() argument
361 struct icmp6hdr *icmp = icmp6_hdr(skb); in parse_icmpv6()
373 int icmp_len = skb->len - skb_transport_offset(skb); in parse_icmpv6()
383 if (unlikely(skb_linearize(skb))) in parse_icmpv6()
386 nd = (struct nd_msg *)skb_transport_header(skb); in parse_icmpv6()
454 static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) in key_extract() argument
462 skb_reset_mac_header(skb); in key_extract()
467 eth = eth_hdr(skb); in key_extract()
471 __skb_pull(skb, 2 * ETH_ALEN); in key_extract()
477 if (skb_vlan_tag_present(skb)) in key_extract()
478 key->eth.tci = htons(skb->vlan_tci); in key_extract()
480 if (unlikely(parse_vlan(skb, key))) in key_extract()
483 key->eth.type = parse_ethertype(skb); in key_extract()
487 skb_reset_network_header(skb); in key_extract()
488 skb_reset_mac_len(skb); in key_extract()
489 __skb_push(skb, skb->data - skb_mac_header(skb)); in key_extract()
496 error = check_iphdr(skb); in key_extract()
501 skb->transport_header = skb->network_header; in key_extract()
507 nh = ip_hdr(skb); in key_extract()
521 skb_shinfo(skb)->gso_type & SKB_GSO_UDP) in key_extract()
528 if (tcphdr_ok(skb)) { in key_extract()
529 struct tcphdr *tcp = tcp_hdr(skb); in key_extract()
538 if (udphdr_ok(skb)) { in key_extract()
539 struct udphdr *udp = udp_hdr(skb); in key_extract()
546 if (sctphdr_ok(skb)) { in key_extract()
547 struct sctphdr *sctp = sctp_hdr(skb); in key_extract()
554 if (icmphdr_ok(skb)) { in key_extract()
555 struct icmphdr *icmp = icmp_hdr(skb); in key_extract()
569 bool arp_available = arphdr_ok(skb); in key_extract()
571 arp = (struct arp_eth_header *)skb_network_header(skb); in key_extract()
605 error = check_header(skb, skb->mac_len + stack_len); in key_extract()
609 memcpy(&lse, skb_network_header(skb), MPLS_HLEN); in key_extract()
614 skb_set_network_header(skb, skb->mac_len + stack_len); in key_extract()
623 nh_len = parse_ipv6hdr(skb, key); in key_extract()
628 skb->transport_header = skb->network_header; in key_extract()
638 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) in key_extract()
643 if (tcphdr_ok(skb)) { in key_extract()
644 struct tcphdr *tcp = tcp_hdr(skb); in key_extract()
652 if (udphdr_ok(skb)) { in key_extract()
653 struct udphdr *udp = udp_hdr(skb); in key_extract()
660 if (sctphdr_ok(skb)) { in key_extract()
661 struct sctphdr *sctp = sctp_hdr(skb); in key_extract()
668 if (icmp6hdr_ok(skb)) { in key_extract()
669 error = parse_icmpv6(skb, key, nh_len); in key_extract()
680 int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key) in ovs_flow_key_update() argument
682 return key_extract(skb, key); in ovs_flow_key_update()
686 struct sk_buff *skb, struct sw_flow_key *key) in ovs_flow_key_extract() argument
707 key->phy.priority = skb->priority; in ovs_flow_key_extract()
708 key->phy.in_port = OVS_CB(skb)->input_vport->port_no; in ovs_flow_key_extract()
709 key->phy.skb_mark = skb->mark; in ovs_flow_key_extract()
713 return key_extract(skb, key); in ovs_flow_key_extract()
717 struct sk_buff *skb, in ovs_flow_key_extract_userspace() argument
729 return key_extract(skb, key); in ovs_flow_key_extract_userspace()