Lines Matching refs:skb

71 			   const struct sk_buff *skb)  in ovs_flow_stats_update()  argument
75 int len = skb->len + (skb_vlan_tag_present(skb) ? VLAN_HLEN : 0); in ovs_flow_stats_update()
182 static int check_header(struct sk_buff *skb, int len) in check_header() argument
184 if (unlikely(skb->len < len)) in check_header()
186 if (unlikely(!pskb_may_pull(skb, len))) in check_header()
191 static bool arphdr_ok(struct sk_buff *skb) in arphdr_ok() argument
193 return pskb_may_pull(skb, skb_network_offset(skb) + in arphdr_ok()
197 static int check_iphdr(struct sk_buff *skb) in check_iphdr() argument
199 unsigned int nh_ofs = skb_network_offset(skb); in check_iphdr()
203 err = check_header(skb, nh_ofs + sizeof(struct iphdr)); in check_iphdr()
207 ip_len = ip_hdrlen(skb); in check_iphdr()
209 skb->len < nh_ofs + ip_len)) in check_iphdr()
212 skb_set_transport_header(skb, nh_ofs + ip_len); in check_iphdr()
216 static bool tcphdr_ok(struct sk_buff *skb) in tcphdr_ok() argument
218 int th_ofs = skb_transport_offset(skb); in tcphdr_ok()
221 if (unlikely(!pskb_may_pull(skb, th_ofs + sizeof(struct tcphdr)))) in tcphdr_ok()
224 tcp_len = tcp_hdrlen(skb); in tcphdr_ok()
226 skb->len < th_ofs + tcp_len)) in tcphdr_ok()
232 static bool udphdr_ok(struct sk_buff *skb) in udphdr_ok() argument
234 return pskb_may_pull(skb, skb_transport_offset(skb) + in udphdr_ok()
238 static bool sctphdr_ok(struct sk_buff *skb) in sctphdr_ok() argument
240 return pskb_may_pull(skb, skb_transport_offset(skb) + in sctphdr_ok()
244 static bool icmphdr_ok(struct sk_buff *skb) in icmphdr_ok() argument
246 return pskb_may_pull(skb, skb_transport_offset(skb) + in icmphdr_ok()
250 static int parse_ipv6hdr(struct sk_buff *skb, struct sw_flow_key *key) in parse_ipv6hdr() argument
252 unsigned int nh_ofs = skb_network_offset(skb); in parse_ipv6hdr()
260 err = check_header(skb, nh_ofs + sizeof(*nh)); in parse_ipv6hdr()
264 nh = ipv6_hdr(skb); in parse_ipv6hdr()
266 payload_ofs = (u8 *)(nh + 1) - skb->data; in parse_ipv6hdr()
275 payload_ofs = ipv6_skip_exthdr(skb, payload_ofs, &nexthdr, &frag_off); in parse_ipv6hdr()
294 skb_set_transport_header(skb, nh_ofs + nh_len); in parse_ipv6hdr()
299 static bool icmp6hdr_ok(struct sk_buff *skb) in icmp6hdr_ok() argument
301 return pskb_may_pull(skb, skb_transport_offset(skb) + in icmp6hdr_ok()
305 static int parse_vlan(struct sk_buff *skb, struct sw_flow_key *key) in parse_vlan() argument
313 if (unlikely(skb->len < sizeof(struct qtag_prefix) + sizeof(__be16))) in parse_vlan()
316 if (unlikely(!pskb_may_pull(skb, sizeof(struct qtag_prefix) + in parse_vlan()
320 qp = (struct qtag_prefix *) skb->data; in parse_vlan()
322 __skb_pull(skb, sizeof(struct qtag_prefix)); in parse_vlan()
327 static __be16 parse_ethertype(struct sk_buff *skb) in parse_ethertype() argument
339 proto = *(__be16 *) skb->data; in parse_ethertype()
340 __skb_pull(skb, sizeof(__be16)); in parse_ethertype()
345 if (skb->len < sizeof(struct llc_snap_hdr)) in parse_ethertype()
348 if (unlikely(!pskb_may_pull(skb, sizeof(struct llc_snap_hdr)))) in parse_ethertype()
351 llc = (struct llc_snap_hdr *) skb->data; in parse_ethertype()
357 __skb_pull(skb, sizeof(struct llc_snap_hdr)); in parse_ethertype()
365 static int parse_icmpv6(struct sk_buff *skb, struct sw_flow_key *key, in parse_icmpv6() argument
368 struct icmp6hdr *icmp = icmp6_hdr(skb); in parse_icmpv6()
380 int icmp_len = skb->len - skb_transport_offset(skb); in parse_icmpv6()
390 if (unlikely(skb_linearize(skb))) in parse_icmpv6()
393 nd = (struct nd_msg *)skb_transport_header(skb); in parse_icmpv6()
461 static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) in key_extract() argument
469 skb_reset_mac_header(skb); in key_extract()
474 eth = eth_hdr(skb); in key_extract()
478 __skb_pull(skb, 2 * ETH_ALEN); in key_extract()
484 if (skb_vlan_tag_present(skb)) in key_extract()
485 key->eth.tci = htons(skb->vlan_tci); in key_extract()
487 if (unlikely(parse_vlan(skb, key))) in key_extract()
490 key->eth.type = parse_ethertype(skb); in key_extract()
494 skb_reset_network_header(skb); in key_extract()
495 skb_reset_mac_len(skb); in key_extract()
496 __skb_push(skb, skb->data - skb_mac_header(skb)); in key_extract()
503 error = check_iphdr(skb); in key_extract()
508 skb->transport_header = skb->network_header; in key_extract()
514 nh = ip_hdr(skb); in key_extract()
528 skb_shinfo(skb)->gso_type & SKB_GSO_UDP) in key_extract()
535 if (tcphdr_ok(skb)) { in key_extract()
536 struct tcphdr *tcp = tcp_hdr(skb); in key_extract()
545 if (udphdr_ok(skb)) { in key_extract()
546 struct udphdr *udp = udp_hdr(skb); in key_extract()
553 if (sctphdr_ok(skb)) { in key_extract()
554 struct sctphdr *sctp = sctp_hdr(skb); in key_extract()
561 if (icmphdr_ok(skb)) { in key_extract()
562 struct icmphdr *icmp = icmp_hdr(skb); in key_extract()
576 bool arp_available = arphdr_ok(skb); in key_extract()
578 arp = (struct arp_eth_header *)skb_network_header(skb); in key_extract()
612 error = check_header(skb, skb->mac_len + stack_len); in key_extract()
616 memcpy(&lse, skb_network_header(skb), MPLS_HLEN); in key_extract()
621 skb_set_network_header(skb, skb->mac_len + stack_len); in key_extract()
630 nh_len = parse_ipv6hdr(skb, key); in key_extract()
638 skb->transport_header = skb->network_header; in key_extract()
649 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) in key_extract()
654 if (tcphdr_ok(skb)) { in key_extract()
655 struct tcphdr *tcp = tcp_hdr(skb); in key_extract()
663 if (udphdr_ok(skb)) { in key_extract()
664 struct udphdr *udp = udp_hdr(skb); in key_extract()
671 if (sctphdr_ok(skb)) { in key_extract()
672 struct sctphdr *sctp = sctp_hdr(skb); in key_extract()
679 if (icmp6hdr_ok(skb)) { in key_extract()
680 error = parse_icmpv6(skb, key, nh_len); in key_extract()
691 int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key) in ovs_flow_key_update() argument
693 return key_extract(skb, key); in ovs_flow_key_update()
697 struct sk_buff *skb, struct sw_flow_key *key) in ovs_flow_key_extract() argument
721 key->phy.priority = skb->priority; in ovs_flow_key_extract()
722 key->phy.in_port = OVS_CB(skb)->input_vport->port_no; in ovs_flow_key_extract()
723 key->phy.skb_mark = skb->mark; in ovs_flow_key_extract()
724 ovs_ct_fill_key(skb, key); in ovs_flow_key_extract()
728 return key_extract(skb, key); in ovs_flow_key_extract()
732 struct sk_buff *skb, in ovs_flow_key_extract_userspace() argument
744 return key_extract(skb, key); in ovs_flow_key_extract_userspace()