Lines Matching refs:key

243 static int parse_ipv6hdr(struct sk_buff *skb, struct sw_flow_key *key)
261 key->ip.proto = NEXTHDR_NONE;
262 key->ip.tos = ipv6_get_dsfield(nh);
263 key->ip.ttl = nh->hop_limit;
264 key->ipv6.label = *(__be32 *)nh & htonl(IPV6_FLOWINFO_FLOWLABEL);
265 key->ipv6.addr.src = nh->saddr;
266 key->ipv6.addr.dst = nh->daddr;
274 key->ip.frag = OVS_FRAG_TYPE_LATER;
276 key->ip.frag = OVS_FRAG_TYPE_FIRST;
278 key->ip.frag = OVS_FRAG_TYPE_NONE;
283 key->ip.proto = nexthdr;
293 static int parse_vlan(struct sk_buff *skb, struct sw_flow_key *key)
309 key->eth.tci = qp->tci | htons(VLAN_TAG_PRESENT);
353 static int parse_icmpv6(struct sk_buff *skb, struct sw_flow_key *key,
361 key->tp.src = htons(icmp->icmp6_type);
362 key->tp.dst = htons(icmp->icmp6_code);
363 memset(&key->ipv6.nd, 0, sizeof(key->ipv6.nd));
382 key->ipv6.nd.target = nd->target;
400 if (unlikely(!is_zero_ether_addr(key->ipv6.nd.sll)))
402 ether_addr_copy(key->ipv6.nd.sll,
406 if (unlikely(!is_zero_ether_addr(key->ipv6.nd.tll)))
408 ether_addr_copy(key->ipv6.nd.tll,
420 memset(&key->ipv6.nd.target, 0, sizeof(key->ipv6.nd.target));
421 memset(key->ipv6.nd.sll, 0, sizeof(key->ipv6.nd.sll));
422 memset(key->ipv6.nd.tll, 0, sizeof(key->ipv6.nd.tll));
428 * key_extract - extracts a flow key from an Ethernet frame.
431 * @key: output flow key
444 * - skb->transport_header: If key->eth.type is ETH_P_IP or ETH_P_IPV6
447 * For other key->eth.type values it is left untouched.
449 static int key_extract(struct sk_buff *skb, struct sw_flow_key *key)
455 key->tp.flags = 0;
463 ether_addr_copy(key->eth.src, eth->h_source);
464 ether_addr_copy(key->eth.dst, eth->h_dest);
471 key->eth.tci = 0;
473 key->eth.tci = htons(skb->vlan_tci);
475 if (unlikely(parse_vlan(skb, key)))
478 key->eth.type = parse_ethertype(skb);
479 if (unlikely(key->eth.type == htons(0)))
486 if (key->eth.type == htons(ETH_P_IP)) {
492 memset(&key->ip, 0, sizeof(key->ip));
493 memset(&key->ipv4, 0, sizeof(key->ipv4));
502 key->ipv4.addr.src = nh->saddr;
503 key->ipv4.addr.dst = nh->daddr;
505 key->ip.proto = nh->protocol;
506 key->ip.tos = nh->tos;
507 key->ip.ttl = nh->ttl;
511 key->ip.frag = OVS_FRAG_TYPE_LATER;
516 key->ip.frag = OVS_FRAG_TYPE_FIRST;
518 key->ip.frag = OVS_FRAG_TYPE_NONE;
521 if (key->ip.proto == IPPROTO_TCP) {
524 key->tp.src = tcp->source;
525 key->tp.dst = tcp->dest;
526 key->tp.flags = TCP_FLAGS_BE16(tcp);
528 memset(&key->tp, 0, sizeof(key->tp));
531 } else if (key->ip.proto == IPPROTO_UDP) {
534 key->tp.src = udp->source;
535 key->tp.dst = udp->dest;
537 memset(&key->tp, 0, sizeof(key->tp));
539 } else if (key->ip.proto == IPPROTO_SCTP) {
542 key->tp.src = sctp->source;
543 key->tp.dst = sctp->dest;
545 memset(&key->tp, 0, sizeof(key->tp));
547 } else if (key->ip.proto == IPPROTO_ICMP) {
553 key->tp.src = htons(icmp->type);
554 key->tp.dst = htons(icmp->code);
556 memset(&key->tp, 0, sizeof(key->tp));
560 } else if (key->eth.type == htons(ETH_P_ARP) ||
561 key->eth.type == htons(ETH_P_RARP)) {
575 key->ip.proto = ntohs(arp->ar_op);
577 key->ip.proto = 0;
579 memcpy(&key->ipv4.addr.src, arp->ar_sip, sizeof(key->ipv4.addr.src));
580 memcpy(&key->ipv4.addr.dst, arp->ar_tip, sizeof(key->ipv4.addr.dst));
581 ether_addr_copy(key->ipv4.arp.sha, arp->ar_sha);
582 ether_addr_copy(key->ipv4.arp.tha, arp->ar_tha);
584 memset(&key->ip, 0, sizeof(key->ip));
585 memset(&key->ipv4, 0, sizeof(key->ipv4));
587 } else if (key->eth.type == htons(ETH_P_IPV6)) {
590 nh_len = parse_ipv6hdr(skb, key);
592 memset(&key->ip, 0, sizeof(key->ip));
593 memset(&key->ipv6.addr, 0, sizeof(key->ipv6.addr));
603 if (key->ip.frag == OVS_FRAG_TYPE_LATER)
606 key->ip.frag = OVS_FRAG_TYPE_FIRST;
609 if (key->ip.proto == NEXTHDR_TCP) {
612 key->tp.src = tcp->source;
613 key->tp.dst = tcp->dest;
614 key->tp.flags = TCP_FLAGS_BE16(tcp);
616 memset(&key->tp, 0, sizeof(key->tp));
618 } else if (key->ip.proto == NEXTHDR_UDP) {
621 key->tp.src = udp->source;
622 key->tp.dst = udp->dest;
624 memset(&key->tp, 0, sizeof(key->tp));
626 } else if (key->ip.proto == NEXTHDR_SCTP) {
629 key->tp.src = sctp->source;
630 key->tp.dst = sctp->dest;
632 memset(&key->tp, 0, sizeof(key->tp));
634 } else if (key->ip.proto == NEXTHDR_ICMP) {
636 error = parse_icmpv6(skb, key, nh_len);
640 memset(&key->tp, 0, sizeof(key->tp));
647 int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key)
649 return key_extract(skb, key);
653 struct sk_buff *skb, struct sw_flow_key *key)
657 memcpy(&key->tun_key, &tun_info->tunnel, sizeof(key->tun_key));
662 > sizeof(key->tun_opts));
663 memcpy(GENEVE_OPTS(key, tun_info->options_len),
665 key->tun_opts_len = tun_info->options_len;
667 key->tun_opts_len = 0;
670 key->tun_opts_len = 0;
671 memset(&key->tun_key, 0, sizeof(key->tun_key));
674 key->phy.priority = skb->priority;
675 key->phy.in_port = OVS_CB(skb)->input_vport->port_no;
676 key->phy.skb_mark = skb->mark;
677 key->ovs_flow_hash = 0;
678 key->recirc_id = 0;
680 return key_extract(skb, key);
685 struct sw_flow_key *key)
690 err = ovs_nla_get_flow_metadata(attr, key);
694 return key_extract(skb, key);