ofproto-dpif: Avoid zeroing tunnel info in handle_miss_upcalls().
[sliver-openvswitch.git] / lib / flow.c
1 /*
2  * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include <config.h>
17 #include <sys/types.h>
18 #include "flow.h"
19 #include <assert.h>
20 #include <errno.h>
21 #include <inttypes.h>
22 #include <limits.h>
23 #include <netinet/in.h>
24 #include <netinet/icmp6.h>
25 #include <netinet/ip6.h>
26 #include <stdint.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include "byte-order.h"
30 #include "coverage.h"
31 #include "csum.h"
32 #include "dynamic-string.h"
33 #include "hash.h"
34 #include "ofpbuf.h"
35 #include "openflow/openflow.h"
36 #include "packets.h"
37 #include "unaligned.h"
38 #include "vlog.h"
39
40 VLOG_DEFINE_THIS_MODULE(flow);
41
42 COVERAGE_DEFINE(flow_extract);
43 COVERAGE_DEFINE(miniflow_malloc);
44
45 static struct arp_eth_header *
46 pull_arp(struct ofpbuf *packet)
47 {
48     return ofpbuf_try_pull(packet, ARP_ETH_HEADER_LEN);
49 }
50
51 static struct ip_header *
52 pull_ip(struct ofpbuf *packet)
53 {
54     if (packet->size >= IP_HEADER_LEN) {
55         struct ip_header *ip = packet->data;
56         int ip_len = IP_IHL(ip->ip_ihl_ver) * 4;
57         if (ip_len >= IP_HEADER_LEN && packet->size >= ip_len) {
58             return ofpbuf_pull(packet, ip_len);
59         }
60     }
61     return NULL;
62 }
63
64 static struct tcp_header *
65 pull_tcp(struct ofpbuf *packet)
66 {
67     if (packet->size >= TCP_HEADER_LEN) {
68         struct tcp_header *tcp = packet->data;
69         int tcp_len = TCP_OFFSET(tcp->tcp_ctl) * 4;
70         if (tcp_len >= TCP_HEADER_LEN && packet->size >= tcp_len) {
71             return ofpbuf_pull(packet, tcp_len);
72         }
73     }
74     return NULL;
75 }
76
77 static struct udp_header *
78 pull_udp(struct ofpbuf *packet)
79 {
80     return ofpbuf_try_pull(packet, UDP_HEADER_LEN);
81 }
82
83 static struct icmp_header *
84 pull_icmp(struct ofpbuf *packet)
85 {
86     return ofpbuf_try_pull(packet, ICMP_HEADER_LEN);
87 }
88
89 static struct icmp6_hdr *
90 pull_icmpv6(struct ofpbuf *packet)
91 {
92     return ofpbuf_try_pull(packet, sizeof(struct icmp6_hdr));
93 }
94
95 static void
96 parse_vlan(struct ofpbuf *b, struct flow *flow)
97 {
98     struct qtag_prefix {
99         ovs_be16 eth_type;      /* ETH_TYPE_VLAN */
100         ovs_be16 tci;
101     };
102
103     if (b->size >= sizeof(struct qtag_prefix) + sizeof(ovs_be16)) {
104         struct qtag_prefix *qp = ofpbuf_pull(b, sizeof *qp);
105         flow->vlan_tci = qp->tci | htons(VLAN_CFI);
106     }
107 }
108
109 static ovs_be16
110 parse_ethertype(struct ofpbuf *b)
111 {
112     struct llc_snap_header *llc;
113     ovs_be16 proto;
114
115     proto = *(ovs_be16 *) ofpbuf_pull(b, sizeof proto);
116     if (ntohs(proto) >= ETH_TYPE_MIN) {
117         return proto;
118     }
119
120     if (b->size < sizeof *llc) {
121         return htons(FLOW_DL_TYPE_NONE);
122     }
123
124     llc = b->data;
125     if (llc->llc.llc_dsap != LLC_DSAP_SNAP
126         || llc->llc.llc_ssap != LLC_SSAP_SNAP
127         || llc->llc.llc_cntl != LLC_CNTL_SNAP
128         || memcmp(llc->snap.snap_org, SNAP_ORG_ETHERNET,
129                   sizeof llc->snap.snap_org)) {
130         return htons(FLOW_DL_TYPE_NONE);
131     }
132
133     ofpbuf_pull(b, sizeof *llc);
134     return llc->snap.snap_type;
135 }
136
137 static int
138 parse_ipv6(struct ofpbuf *packet, struct flow *flow)
139 {
140     const struct ip6_hdr *nh;
141     ovs_be32 tc_flow;
142     int nexthdr;
143
144     nh = ofpbuf_try_pull(packet, sizeof *nh);
145     if (!nh) {
146         return EINVAL;
147     }
148
149     nexthdr = nh->ip6_nxt;
150
151     flow->ipv6_src = nh->ip6_src;
152     flow->ipv6_dst = nh->ip6_dst;
153
154     tc_flow = get_unaligned_be32(&nh->ip6_flow);
155     flow->nw_tos = ntohl(tc_flow) >> 20;
156     flow->ipv6_label = tc_flow & htonl(IPV6_LABEL_MASK);
157     flow->nw_ttl = nh->ip6_hlim;
158     flow->nw_proto = IPPROTO_NONE;
159
160     while (1) {
161         if ((nexthdr != IPPROTO_HOPOPTS)
162                 && (nexthdr != IPPROTO_ROUTING)
163                 && (nexthdr != IPPROTO_DSTOPTS)
164                 && (nexthdr != IPPROTO_AH)
165                 && (nexthdr != IPPROTO_FRAGMENT)) {
166             /* It's either a terminal header (e.g., TCP, UDP) or one we
167              * don't understand.  In either case, we're done with the
168              * packet, so use it to fill in 'nw_proto'. */
169             break;
170         }
171
172         /* We only verify that at least 8 bytes of the next header are
173          * available, but many of these headers are longer.  Ensure that
174          * accesses within the extension header are within those first 8
175          * bytes. All extension headers are required to be at least 8
176          * bytes. */
177         if (packet->size < 8) {
178             return EINVAL;
179         }
180
181         if ((nexthdr == IPPROTO_HOPOPTS)
182                 || (nexthdr == IPPROTO_ROUTING)
183                 || (nexthdr == IPPROTO_DSTOPTS)) {
184             /* These headers, while different, have the fields we care about
185              * in the same location and with the same interpretation. */
186             const struct ip6_ext *ext_hdr = packet->data;
187             nexthdr = ext_hdr->ip6e_nxt;
188             if (!ofpbuf_try_pull(packet, (ext_hdr->ip6e_len + 1) * 8)) {
189                 return EINVAL;
190             }
191         } else if (nexthdr == IPPROTO_AH) {
192             /* A standard AH definition isn't available, but the fields
193              * we care about are in the same location as the generic
194              * option header--only the header length is calculated
195              * differently. */
196             const struct ip6_ext *ext_hdr = packet->data;
197             nexthdr = ext_hdr->ip6e_nxt;
198             if (!ofpbuf_try_pull(packet, (ext_hdr->ip6e_len + 2) * 4)) {
199                return EINVAL;
200             }
201         } else if (nexthdr == IPPROTO_FRAGMENT) {
202             const struct ip6_frag *frag_hdr = packet->data;
203
204             nexthdr = frag_hdr->ip6f_nxt;
205             if (!ofpbuf_try_pull(packet, sizeof *frag_hdr)) {
206                 return EINVAL;
207             }
208
209             /* We only process the first fragment. */
210             if (frag_hdr->ip6f_offlg != htons(0)) {
211                 if ((frag_hdr->ip6f_offlg & IP6F_OFF_MASK) == htons(0)) {
212                     flow->nw_frag = FLOW_NW_FRAG_ANY;
213                 } else {
214                     flow->nw_frag |= FLOW_NW_FRAG_LATER;
215                     nexthdr = IPPROTO_FRAGMENT;
216                     break;
217                 }
218             }
219         }
220     }
221
222     flow->nw_proto = nexthdr;
223     return 0;
224 }
225
226 static void
227 parse_tcp(struct ofpbuf *packet, struct ofpbuf *b, struct flow *flow)
228 {
229     const struct tcp_header *tcp = pull_tcp(b);
230     if (tcp) {
231         flow->tp_src = tcp->tcp_src;
232         flow->tp_dst = tcp->tcp_dst;
233         packet->l7 = b->data;
234     }
235 }
236
237 static void
238 parse_udp(struct ofpbuf *packet, struct ofpbuf *b, struct flow *flow)
239 {
240     const struct udp_header *udp = pull_udp(b);
241     if (udp) {
242         flow->tp_src = udp->udp_src;
243         flow->tp_dst = udp->udp_dst;
244         packet->l7 = b->data;
245     }
246 }
247
248 static bool
249 parse_icmpv6(struct ofpbuf *b, struct flow *flow)
250 {
251     const struct icmp6_hdr *icmp = pull_icmpv6(b);
252
253     if (!icmp) {
254         return false;
255     }
256
257     /* The ICMPv6 type and code fields use the 16-bit transport port
258      * fields, so we need to store them in 16-bit network byte order. */
259     flow->tp_src = htons(icmp->icmp6_type);
260     flow->tp_dst = htons(icmp->icmp6_code);
261
262     if (icmp->icmp6_code == 0 &&
263         (icmp->icmp6_type == ND_NEIGHBOR_SOLICIT ||
264          icmp->icmp6_type == ND_NEIGHBOR_ADVERT)) {
265         const struct in6_addr *nd_target;
266
267         nd_target = ofpbuf_try_pull(b, sizeof *nd_target);
268         if (!nd_target) {
269             return false;
270         }
271         flow->nd_target = *nd_target;
272
273         while (b->size >= 8) {
274             /* The minimum size of an option is 8 bytes, which also is
275              * the size of Ethernet link-layer options. */
276             const struct nd_opt_hdr *nd_opt = b->data;
277             int opt_len = nd_opt->nd_opt_len * 8;
278
279             if (!opt_len || opt_len > b->size) {
280                 goto invalid;
281             }
282
283             /* Store the link layer address if the appropriate option is
284              * provided.  It is considered an error if the same link
285              * layer option is specified twice. */
286             if (nd_opt->nd_opt_type == ND_OPT_SOURCE_LINKADDR
287                     && opt_len == 8) {
288                 if (eth_addr_is_zero(flow->arp_sha)) {
289                     memcpy(flow->arp_sha, nd_opt + 1, ETH_ADDR_LEN);
290                 } else {
291                     goto invalid;
292                 }
293             } else if (nd_opt->nd_opt_type == ND_OPT_TARGET_LINKADDR
294                     && opt_len == 8) {
295                 if (eth_addr_is_zero(flow->arp_tha)) {
296                     memcpy(flow->arp_tha, nd_opt + 1, ETH_ADDR_LEN);
297                 } else {
298                     goto invalid;
299                 }
300             }
301
302             if (!ofpbuf_try_pull(b, opt_len)) {
303                 goto invalid;
304             }
305         }
306     }
307
308     return true;
309
310 invalid:
311     memset(&flow->nd_target, 0, sizeof(flow->nd_target));
312     memset(flow->arp_sha, 0, sizeof(flow->arp_sha));
313     memset(flow->arp_tha, 0, sizeof(flow->arp_tha));
314
315     return false;
316
317 }
318
319 /* Initializes 'flow' members from 'packet', 'skb_priority', 'tnl', and
320  * 'ofp_in_port'.
321  *
322  * Initializes 'packet' header pointers as follows:
323  *
324  *    - packet->l2 to the start of the Ethernet header.
325  *
326  *    - packet->l3 to just past the Ethernet header, or just past the
327  *      vlan_header if one is present, to the first byte of the payload of the
328  *      Ethernet frame.
329  *
330  *    - packet->l4 to just past the IPv4 header, if one is present and has a
331  *      correct length, and otherwise NULL.
332  *
333  *    - packet->l7 to just past the TCP or UDP or ICMP header, if one is
334  *      present and has a correct length, and otherwise NULL.
335  */
336 void
337 flow_extract(struct ofpbuf *packet, uint32_t skb_priority,
338              const struct flow_tnl *tnl, uint16_t ofp_in_port,
339              struct flow *flow)
340 {
341     struct ofpbuf b = *packet;
342     struct eth_header *eth;
343
344     COVERAGE_INC(flow_extract);
345
346     memset(flow, 0, sizeof *flow);
347
348     if (tnl) {
349         assert(tnl != &flow->tunnel);
350         flow->tunnel = *tnl;
351     }
352     flow->in_port = ofp_in_port;
353     flow->skb_priority = skb_priority;
354
355     packet->l2 = b.data;
356     packet->l3 = NULL;
357     packet->l4 = NULL;
358     packet->l7 = NULL;
359
360     if (b.size < sizeof *eth) {
361         return;
362     }
363
364     /* Link layer. */
365     eth = b.data;
366     memcpy(flow->dl_src, eth->eth_src, ETH_ADDR_LEN);
367     memcpy(flow->dl_dst, eth->eth_dst, ETH_ADDR_LEN);
368
369     /* dl_type, vlan_tci. */
370     ofpbuf_pull(&b, ETH_ADDR_LEN * 2);
371     if (eth->eth_type == htons(ETH_TYPE_VLAN)) {
372         parse_vlan(&b, flow);
373     }
374     flow->dl_type = parse_ethertype(&b);
375
376     /* Network layer. */
377     packet->l3 = b.data;
378     if (flow->dl_type == htons(ETH_TYPE_IP)) {
379         const struct ip_header *nh = pull_ip(&b);
380         if (nh) {
381             packet->l4 = b.data;
382
383             flow->nw_src = get_unaligned_be32(&nh->ip_src);
384             flow->nw_dst = get_unaligned_be32(&nh->ip_dst);
385             flow->nw_proto = nh->ip_proto;
386
387             flow->nw_tos = nh->ip_tos;
388             if (IP_IS_FRAGMENT(nh->ip_frag_off)) {
389                 flow->nw_frag = FLOW_NW_FRAG_ANY;
390                 if (nh->ip_frag_off & htons(IP_FRAG_OFF_MASK)) {
391                     flow->nw_frag |= FLOW_NW_FRAG_LATER;
392                 }
393             }
394             flow->nw_ttl = nh->ip_ttl;
395
396             if (!(nh->ip_frag_off & htons(IP_FRAG_OFF_MASK))) {
397                 if (flow->nw_proto == IPPROTO_TCP) {
398                     parse_tcp(packet, &b, flow);
399                 } else if (flow->nw_proto == IPPROTO_UDP) {
400                     parse_udp(packet, &b, flow);
401                 } else if (flow->nw_proto == IPPROTO_ICMP) {
402                     const struct icmp_header *icmp = pull_icmp(&b);
403                     if (icmp) {
404                         flow->tp_src = htons(icmp->icmp_type);
405                         flow->tp_dst = htons(icmp->icmp_code);
406                         packet->l7 = b.data;
407                     }
408                 }
409             }
410         }
411     } else if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
412         if (parse_ipv6(&b, flow)) {
413             return;
414         }
415
416         packet->l4 = b.data;
417         if (flow->nw_proto == IPPROTO_TCP) {
418             parse_tcp(packet, &b, flow);
419         } else if (flow->nw_proto == IPPROTO_UDP) {
420             parse_udp(packet, &b, flow);
421         } else if (flow->nw_proto == IPPROTO_ICMPV6) {
422             if (parse_icmpv6(&b, flow)) {
423                 packet->l7 = b.data;
424             }
425         }
426     } else if (flow->dl_type == htons(ETH_TYPE_ARP)) {
427         const struct arp_eth_header *arp = pull_arp(&b);
428         if (arp && arp->ar_hrd == htons(1)
429             && arp->ar_pro == htons(ETH_TYPE_IP)
430             && arp->ar_hln == ETH_ADDR_LEN
431             && arp->ar_pln == 4) {
432             /* We only match on the lower 8 bits of the opcode. */
433             if (ntohs(arp->ar_op) <= 0xff) {
434                 flow->nw_proto = ntohs(arp->ar_op);
435             }
436
437             if ((flow->nw_proto == ARP_OP_REQUEST)
438                 || (flow->nw_proto == ARP_OP_REPLY)) {
439                 flow->nw_src = arp->ar_spa;
440                 flow->nw_dst = arp->ar_tpa;
441                 memcpy(flow->arp_sha, arp->ar_sha, ETH_ADDR_LEN);
442                 memcpy(flow->arp_tha, arp->ar_tha, ETH_ADDR_LEN);
443             }
444         }
445     }
446 }
447
448 /* For every bit of a field that is wildcarded in 'wildcards', sets the
449  * corresponding bit in 'flow' to zero. */
450 void
451 flow_zero_wildcards(struct flow *flow, const struct flow_wildcards *wildcards)
452 {
453     uint32_t *flow_u32 = (uint32_t *) flow;
454     const uint32_t *wc_u32 = (const uint32_t *) &wildcards->masks;
455     size_t i;
456
457     for (i = 0; i < FLOW_U32S; i++) {
458         flow_u32[i] &= wc_u32[i];
459     }
460 }
461
462 /* Initializes 'fmd' with the metadata found in 'flow'. */
463 void
464 flow_get_metadata(const struct flow *flow, struct flow_metadata *fmd)
465 {
466     BUILD_ASSERT_DECL(FLOW_WC_SEQ == 17);
467
468     fmd->tun_id = flow->tunnel.tun_id;
469     fmd->metadata = flow->metadata;
470     memcpy(fmd->regs, flow->regs, sizeof fmd->regs);
471     fmd->in_port = flow->in_port;
472 }
473
474 char *
475 flow_to_string(const struct flow *flow)
476 {
477     struct ds ds = DS_EMPTY_INITIALIZER;
478     flow_format(&ds, flow);
479     return ds_cstr(&ds);
480 }
481
482 static void format_tunnel_flags(uint16_t flags, struct ds *ds)
483 {
484     flags &= ~FLOW_TNL_F_KEY;
485
486     if (flags & FLOW_TNL_F_DONT_FRAGMENT) {
487         ds_put_cstr(ds, ",df");
488         flags &= ~FLOW_TNL_F_DONT_FRAGMENT;
489     }
490
491     if (flags & FLOW_TNL_F_CSUM) {
492         ds_put_cstr(ds, ",csum");
493         flags &= ~FLOW_TNL_F_CSUM;
494     }
495
496     if (flags) {
497         ds_put_format(ds, ",flags:%#"PRIx16, flags);
498     }
499 }
500
501 void
502 flow_format(struct ds *ds, const struct flow *flow)
503 {
504     ds_put_format(ds, "priority:%"PRIu32, flow->skb_priority);
505
506     if (flow->tunnel.ip_dst || flow->tunnel.tun_id) {
507         ds_put_cstr(ds, ",tunnel(");
508         ds_put_format(ds, IP_FMT"->"IP_FMT, IP_ARGS(&flow->tunnel.ip_src),
509                                             IP_ARGS(&flow->tunnel.ip_dst));
510
511         if (flow->tunnel.flags & FLOW_TNL_F_KEY) {
512             ds_put_format(ds, ",key:%#"PRIx64, ntohll(flow->tunnel.tun_id));
513         }
514         ds_put_format(ds, ",tos:%#"PRIx8",ttl:%"PRIu8, flow->tunnel.ip_tos,
515                                                        flow->tunnel.ip_ttl);
516         format_tunnel_flags(flow->tunnel.flags, ds);
517         ds_put_char(ds, ')');
518     }
519
520     ds_put_format(ds, ",metadata:%#"PRIx64
521                       ",in_port:%04"PRIx16,
522                       ntohll(flow->metadata),
523                       flow->in_port);
524
525     ds_put_format(ds, ",tci(");
526     if (flow->vlan_tci) {
527         ds_put_format(ds, "vlan:%"PRIu16",pcp:%d",
528                       vlan_tci_to_vid(flow->vlan_tci),
529                       vlan_tci_to_pcp(flow->vlan_tci));
530     } else {
531         ds_put_char(ds, '0');
532     }
533     ds_put_format(ds, ") mac("ETH_ADDR_FMT"->"ETH_ADDR_FMT
534                       ") type:%04"PRIx16,
535                   ETH_ADDR_ARGS(flow->dl_src),
536                   ETH_ADDR_ARGS(flow->dl_dst),
537                   ntohs(flow->dl_type));
538
539     if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
540         ds_put_format(ds, " label:%#"PRIx32" proto:%"PRIu8" tos:%#"PRIx8
541                           " ttl:%"PRIu8" ipv6(",
542                       ntohl(flow->ipv6_label), flow->nw_proto,
543                       flow->nw_tos, flow->nw_ttl);
544         print_ipv6_addr(ds, &flow->ipv6_src);
545         ds_put_cstr(ds, "->");
546         print_ipv6_addr(ds, &flow->ipv6_dst);
547         ds_put_char(ds, ')');
548     } else if (flow->dl_type == htons(ETH_TYPE_IP) ||
549                flow->dl_type == htons(ETH_TYPE_ARP)) {
550         ds_put_format(ds, " proto:%"PRIu8" tos:%#"PRIx8" ttl:%"PRIu8
551                           " ip("IP_FMT"->"IP_FMT")",
552                           flow->nw_proto, flow->nw_tos, flow->nw_ttl,
553                           IP_ARGS(&flow->nw_src), IP_ARGS(&flow->nw_dst));
554     }
555     if (flow->nw_frag) {
556         ds_put_format(ds, " frag(%s)",
557                       flow->nw_frag == FLOW_NW_FRAG_ANY ? "first"
558                       : flow->nw_frag == (FLOW_NW_FRAG_ANY | FLOW_NW_FRAG_LATER)
559                       ? "later" : "<error>");
560     }
561     if (flow->tp_src || flow->tp_dst) {
562         ds_put_format(ds, " port(%"PRIu16"->%"PRIu16")",
563                 ntohs(flow->tp_src), ntohs(flow->tp_dst));
564     }
565     if (!eth_addr_is_zero(flow->arp_sha) || !eth_addr_is_zero(flow->arp_tha)) {
566         ds_put_format(ds, " arp_ha("ETH_ADDR_FMT"->"ETH_ADDR_FMT")",
567                 ETH_ADDR_ARGS(flow->arp_sha),
568                 ETH_ADDR_ARGS(flow->arp_tha));
569     }
570 }
571
572 void
573 flow_print(FILE *stream, const struct flow *flow)
574 {
575     char *s = flow_to_string(flow);
576     fputs(s, stream);
577     free(s);
578 }
579 \f
580 /* flow_wildcards functions. */
581
582 /* Initializes 'wc' as a set of wildcards that matches every packet. */
583 void
584 flow_wildcards_init_catchall(struct flow_wildcards *wc)
585 {
586     memset(&wc->masks, 0, sizeof wc->masks);
587 }
588
589 /* Initializes 'wc' as an exact-match set of wildcards; that is, 'wc' does not
590  * wildcard any bits or fields. */
591 void
592 flow_wildcards_init_exact(struct flow_wildcards *wc)
593 {
594     memset(&wc->masks, 0xff, sizeof wc->masks);
595     memset(wc->masks.zeros, 0, sizeof wc->masks.zeros);
596 }
597
598 /* Returns true if 'wc' matches every packet, false if 'wc' fixes any bits or
599  * fields. */
600 bool
601 flow_wildcards_is_catchall(const struct flow_wildcards *wc)
602 {
603     const uint32_t *wc_u32 = (const uint32_t *) &wc->masks;
604     size_t i;
605
606     for (i = 0; i < FLOW_U32S; i++) {
607         if (wc_u32[i]) {
608             return false;
609         }
610     }
611     return true;
612 }
613
614 /* Initializes 'dst' as the combination of wildcards in 'src1' and 'src2'.
615  * That is, a bit or a field is wildcarded in 'dst' if it is wildcarded in
616  * 'src1' or 'src2' or both.  */
617 void
618 flow_wildcards_combine(struct flow_wildcards *dst,
619                        const struct flow_wildcards *src1,
620                        const struct flow_wildcards *src2)
621 {
622     uint32_t *dst_u32 = (uint32_t *) &dst->masks;
623     const uint32_t *src1_u32 = (const uint32_t *) &src1->masks;
624     const uint32_t *src2_u32 = (const uint32_t *) &src2->masks;
625     size_t i;
626
627     for (i = 0; i < FLOW_U32S; i++) {
628         dst_u32[i] = src1_u32[i] & src2_u32[i];
629     }
630 }
631
632 /* Returns a hash of the wildcards in 'wc'. */
633 uint32_t
634 flow_wildcards_hash(const struct flow_wildcards *wc, uint32_t basis)
635 {
636     return flow_hash(&wc->masks, basis);;
637 }
638
639 /* Returns true if 'a' and 'b' represent the same wildcards, false if they are
640  * different. */
641 bool
642 flow_wildcards_equal(const struct flow_wildcards *a,
643                      const struct flow_wildcards *b)
644 {
645     return flow_equal(&a->masks, &b->masks);
646 }
647
648 /* Returns true if at least one bit or field is wildcarded in 'a' but not in
649  * 'b', false otherwise. */
650 bool
651 flow_wildcards_has_extra(const struct flow_wildcards *a,
652                          const struct flow_wildcards *b)
653 {
654     const uint32_t *a_u32 = (const uint32_t *) &a->masks;
655     const uint32_t *b_u32 = (const uint32_t *) &b->masks;
656     size_t i;
657
658     for (i = 0; i < FLOW_U32S; i++) {
659         if ((a_u32[i] & b_u32[i]) != b_u32[i]) {
660             return true;
661         }
662     }
663     return false;
664 }
665
666 /* Returns true if 'a' and 'b' are equal, except that 0-bits (wildcarded bits)
667  * in 'wc' do not need to be equal in 'a' and 'b'. */
668 bool
669 flow_equal_except(const struct flow *a, const struct flow *b,
670                   const struct flow_wildcards *wc)
671 {
672     const uint32_t *a_u32 = (const uint32_t *) a;
673     const uint32_t *b_u32 = (const uint32_t *) b;
674     const uint32_t *wc_u32 = (const uint32_t *) &wc->masks;
675     size_t i;
676
677     for (i = 0; i < FLOW_U32S; i++) {
678         if ((a_u32[i] ^ b_u32[i]) & wc_u32[i]) {
679             return false;
680         }
681     }
682     return true;
683 }
684
685 /* Sets the wildcard mask for register 'idx' in 'wc' to 'mask'.
686  * (A 0-bit indicates a wildcard bit.) */
687 void
688 flow_wildcards_set_reg_mask(struct flow_wildcards *wc, int idx, uint32_t mask)
689 {
690     wc->masks.regs[idx] = mask;
691 }
692
693 /* Hashes 'flow' based on its L2 through L4 protocol information. */
694 uint32_t
695 flow_hash_symmetric_l4(const struct flow *flow, uint32_t basis)
696 {
697     struct {
698         union {
699             ovs_be32 ipv4_addr;
700             struct in6_addr ipv6_addr;
701         };
702         ovs_be16 eth_type;
703         ovs_be16 vlan_tci;
704         ovs_be16 tp_port;
705         uint8_t eth_addr[ETH_ADDR_LEN];
706         uint8_t ip_proto;
707     } fields;
708
709     int i;
710
711     memset(&fields, 0, sizeof fields);
712     for (i = 0; i < ETH_ADDR_LEN; i++) {
713         fields.eth_addr[i] = flow->dl_src[i] ^ flow->dl_dst[i];
714     }
715     fields.vlan_tci = flow->vlan_tci & htons(VLAN_VID_MASK);
716     fields.eth_type = flow->dl_type;
717
718     /* UDP source and destination port are not taken into account because they
719      * will not necessarily be symmetric in a bidirectional flow. */
720     if (fields.eth_type == htons(ETH_TYPE_IP)) {
721         fields.ipv4_addr = flow->nw_src ^ flow->nw_dst;
722         fields.ip_proto = flow->nw_proto;
723         if (fields.ip_proto == IPPROTO_TCP) {
724             fields.tp_port = flow->tp_src ^ flow->tp_dst;
725         }
726     } else if (fields.eth_type == htons(ETH_TYPE_IPV6)) {
727         const uint8_t *a = &flow->ipv6_src.s6_addr[0];
728         const uint8_t *b = &flow->ipv6_dst.s6_addr[0];
729         uint8_t *ipv6_addr = &fields.ipv6_addr.s6_addr[0];
730
731         for (i=0; i<16; i++) {
732             ipv6_addr[i] = a[i] ^ b[i];
733         }
734         fields.ip_proto = flow->nw_proto;
735         if (fields.ip_proto == IPPROTO_TCP) {
736             fields.tp_port = flow->tp_src ^ flow->tp_dst;
737         }
738     }
739     return hash_bytes(&fields, sizeof fields, basis);
740 }
741
742 /* Hashes the portions of 'flow' designated by 'fields'. */
743 uint32_t
744 flow_hash_fields(const struct flow *flow, enum nx_hash_fields fields,
745                  uint16_t basis)
746 {
747     switch (fields) {
748
749     case NX_HASH_FIELDS_ETH_SRC:
750         return hash_bytes(flow->dl_src, sizeof flow->dl_src, basis);
751
752     case NX_HASH_FIELDS_SYMMETRIC_L4:
753         return flow_hash_symmetric_l4(flow, basis);
754     }
755
756     NOT_REACHED();
757 }
758
759 /* Returns a string representation of 'fields'. */
760 const char *
761 flow_hash_fields_to_str(enum nx_hash_fields fields)
762 {
763     switch (fields) {
764     case NX_HASH_FIELDS_ETH_SRC: return "eth_src";
765     case NX_HASH_FIELDS_SYMMETRIC_L4: return "symmetric_l4";
766     default: return "<unknown>";
767     }
768 }
769
770 /* Returns true if the value of 'fields' is supported. Otherwise false. */
771 bool
772 flow_hash_fields_valid(enum nx_hash_fields fields)
773 {
774     return fields == NX_HASH_FIELDS_ETH_SRC
775         || fields == NX_HASH_FIELDS_SYMMETRIC_L4;
776 }
777
778 /* Sets the VLAN VID that 'flow' matches to 'vid', which is interpreted as an
779  * OpenFlow 1.0 "dl_vlan" value:
780  *
781  *      - If it is in the range 0...4095, 'flow->vlan_tci' is set to match
782  *        that VLAN.  Any existing PCP match is unchanged (it becomes 0 if
783  *        'flow' previously matched packets without a VLAN header).
784  *
785  *      - If it is OFP_VLAN_NONE, 'flow->vlan_tci' is set to match a packet
786  *        without a VLAN tag.
787  *
788  *      - Other values of 'vid' should not be used. */
789 void
790 flow_set_dl_vlan(struct flow *flow, ovs_be16 vid)
791 {
792     if (vid == htons(OFP10_VLAN_NONE)) {
793         flow->vlan_tci = htons(0);
794     } else {
795         vid &= htons(VLAN_VID_MASK);
796         flow->vlan_tci &= ~htons(VLAN_VID_MASK);
797         flow->vlan_tci |= htons(VLAN_CFI) | vid;
798     }
799 }
800
801 /* Sets the VLAN VID that 'flow' matches to 'vid', which is interpreted as an
802  * OpenFlow 1.2 "vlan_vid" value, that is, the low 13 bits of 'vlan_tci' (VID
803  * plus CFI). */
804 void
805 flow_set_vlan_vid(struct flow *flow, ovs_be16 vid)
806 {
807     ovs_be16 mask = htons(VLAN_VID_MASK | VLAN_CFI);
808     flow->vlan_tci &= ~mask;
809     flow->vlan_tci |= vid & mask;
810 }
811
812 /* Sets the VLAN PCP that 'flow' matches to 'pcp', which should be in the
813  * range 0...7.
814  *
815  * This function has no effect on the VLAN ID that 'flow' matches.
816  *
817  * After calling this function, 'flow' will not match packets without a VLAN
818  * header. */
819 void
820 flow_set_vlan_pcp(struct flow *flow, uint8_t pcp)
821 {
822     pcp &= 0x07;
823     flow->vlan_tci &= ~htons(VLAN_PCP_MASK);
824     flow->vlan_tci |= htons((pcp << VLAN_PCP_SHIFT) | VLAN_CFI);
825 }
826
827 /* Puts into 'b' a packet that flow_extract() would parse as having the given
828  * 'flow'.
829  *
830  * (This is useful only for testing, obviously, and the packet isn't really
831  * valid. It hasn't got some checksums filled in, for one, and lots of fields
832  * are just zeroed.) */
833 void
834 flow_compose(struct ofpbuf *b, const struct flow *flow)
835 {
836     eth_compose(b, flow->dl_dst, flow->dl_src, ntohs(flow->dl_type), 0);
837     if (flow->dl_type == htons(FLOW_DL_TYPE_NONE)) {
838         struct eth_header *eth = b->l2;
839         eth->eth_type = htons(b->size);
840         return;
841     }
842
843     if (flow->vlan_tci & htons(VLAN_CFI)) {
844         eth_push_vlan(b, flow->vlan_tci);
845     }
846
847     if (flow->dl_type == htons(ETH_TYPE_IP)) {
848         struct ip_header *ip;
849
850         b->l3 = ip = ofpbuf_put_zeros(b, sizeof *ip);
851         ip->ip_ihl_ver = IP_IHL_VER(5, 4);
852         ip->ip_tos = flow->nw_tos;
853         ip->ip_proto = flow->nw_proto;
854         ip->ip_src = flow->nw_src;
855         ip->ip_dst = flow->nw_dst;
856
857         if (flow->nw_frag & FLOW_NW_FRAG_ANY) {
858             ip->ip_frag_off |= htons(IP_MORE_FRAGMENTS);
859             if (flow->nw_frag & FLOW_NW_FRAG_LATER) {
860                 ip->ip_frag_off |= htons(100);
861             }
862         }
863         if (!(flow->nw_frag & FLOW_NW_FRAG_ANY)
864             || !(flow->nw_frag & FLOW_NW_FRAG_LATER)) {
865             if (flow->nw_proto == IPPROTO_TCP) {
866                 struct tcp_header *tcp;
867
868                 b->l4 = tcp = ofpbuf_put_zeros(b, sizeof *tcp);
869                 tcp->tcp_src = flow->tp_src;
870                 tcp->tcp_dst = flow->tp_dst;
871                 tcp->tcp_ctl = TCP_CTL(0, 5);
872             } else if (flow->nw_proto == IPPROTO_UDP) {
873                 struct udp_header *udp;
874
875                 b->l4 = udp = ofpbuf_put_zeros(b, sizeof *udp);
876                 udp->udp_src = flow->tp_src;
877                 udp->udp_dst = flow->tp_dst;
878             } else if (flow->nw_proto == IPPROTO_ICMP) {
879                 struct icmp_header *icmp;
880
881                 b->l4 = icmp = ofpbuf_put_zeros(b, sizeof *icmp);
882                 icmp->icmp_type = ntohs(flow->tp_src);
883                 icmp->icmp_code = ntohs(flow->tp_dst);
884                 icmp->icmp_csum = csum(icmp, ICMP_HEADER_LEN);
885             }
886         }
887
888         ip = b->l3;
889         ip->ip_tot_len = htons((uint8_t *) b->data + b->size
890                                - (uint8_t *) b->l3);
891         ip->ip_csum = csum(ip, sizeof *ip);
892     } else if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
893         /* XXX */
894     } else if (flow->dl_type == htons(ETH_TYPE_ARP)) {
895         struct arp_eth_header *arp;
896
897         b->l3 = arp = ofpbuf_put_zeros(b, sizeof *arp);
898         arp->ar_hrd = htons(1);
899         arp->ar_pro = htons(ETH_TYPE_IP);
900         arp->ar_hln = ETH_ADDR_LEN;
901         arp->ar_pln = 4;
902         arp->ar_op = htons(flow->nw_proto);
903
904         if (flow->nw_proto == ARP_OP_REQUEST ||
905             flow->nw_proto == ARP_OP_REPLY) {
906             arp->ar_spa = flow->nw_src;
907             arp->ar_tpa = flow->nw_dst;
908             memcpy(arp->ar_sha, flow->arp_sha, ETH_ADDR_LEN);
909             memcpy(arp->ar_tha, flow->arp_tha, ETH_ADDR_LEN);
910         }
911     }
912 }
913 \f
914 /* Compressed flow. */
915
916 static int
917 miniflow_n_values(const struct miniflow *flow)
918 {
919     int n, i;
920
921     n = 0;
922     for (i = 0; i < MINI_N_MAPS; i++) {
923         n += popcount(flow->map[i]);
924     }
925     return n;
926 }
927
928 static uint32_t *
929 miniflow_alloc_values(struct miniflow *flow, int n)
930 {
931     if (n <= MINI_N_INLINE) {
932         return flow->inline_values;
933     } else {
934         COVERAGE_INC(miniflow_malloc);
935         return xmalloc(n * sizeof *flow->values);
936     }
937 }
938
939 /* Initializes 'dst' as a copy of 'src'.  The caller must eventually free 'dst'
940  * with miniflow_destroy(). */
941 void
942 miniflow_init(struct miniflow *dst, const struct flow *src)
943 {
944     const uint32_t *src_u32 = (const uint32_t *) src;
945     unsigned int ofs;
946     unsigned int i;
947     int n;
948
949     /* Initialize dst->map, counting the number of nonzero elements. */
950     n = 0;
951     memset(dst->map, 0, sizeof dst->map);
952     for (i = 0; i < FLOW_U32S; i++) {
953         if (src_u32[i]) {
954             dst->map[i / 32] |= 1u << (i % 32);
955             n++;
956         }
957     }
958
959     /* Initialize dst->values. */
960     dst->values = miniflow_alloc_values(dst, n);
961     ofs = 0;
962     for (i = 0; i < MINI_N_MAPS; i++) {
963         uint32_t map;
964
965         for (map = dst->map[i]; map; map = zero_rightmost_1bit(map)) {
966             dst->values[ofs++] = src_u32[raw_ctz(map) + i * 32];
967         }
968     }
969 }
970
971 /* Initializes 'dst' as a copy of 'src'.  The caller must eventually free 'dst'
972  * with miniflow_destroy(). */
973 void
974 miniflow_clone(struct miniflow *dst, const struct miniflow *src)
975 {
976     int n = miniflow_n_values(src);
977     memcpy(dst->map, src->map, sizeof dst->map);
978     dst->values = miniflow_alloc_values(dst, n);
979     memcpy(dst->values, src->values, n * sizeof *dst->values);
980 }
981
982 /* Frees any memory owned by 'flow'.  Does not free the storage in which 'flow'
983  * itself resides; the caller is responsible for that. */
984 void
985 miniflow_destroy(struct miniflow *flow)
986 {
987     if (flow->values != flow->inline_values) {
988         free(flow->values);
989     }
990 }
991
992 /* Initializes 'dst' as a copy of 'src'. */
993 void
994 miniflow_expand(const struct miniflow *src, struct flow *dst)
995 {
996     uint32_t *dst_u32 = (uint32_t *) dst;
997     int ofs;
998     int i;
999
1000     memset(dst_u32, 0, sizeof *dst);
1001
1002     ofs = 0;
1003     for (i = 0; i < MINI_N_MAPS; i++) {
1004         uint32_t map;
1005
1006         for (map = src->map[i]; map; map = zero_rightmost_1bit(map)) {
1007             dst_u32[raw_ctz(map) + i * 32] = src->values[ofs++];
1008         }
1009     }
1010 }
1011
1012 static const uint32_t *
1013 miniflow_get__(const struct miniflow *flow, unsigned int u32_ofs)
1014 {
1015     if (!(flow->map[u32_ofs / 32] & (1u << (u32_ofs % 32)))) {
1016         static const uint32_t zero = 0;
1017         return &zero;
1018     } else {
1019         const uint32_t *p = flow->values;
1020
1021         BUILD_ASSERT(MINI_N_MAPS == 2);
1022         if (u32_ofs < 32) {
1023             p += popcount(flow->map[0] & ((1u << u32_ofs) - 1));
1024         } else {
1025             p += popcount(flow->map[0]);
1026             p += popcount(flow->map[1] & ((1u << (u32_ofs - 32)) - 1));
1027         }
1028         return p;
1029     }
1030 }
1031
1032 /* Returns the uint32_t that would be at byte offset '4 * u32_ofs' if 'flow'
1033  * were expanded into a "struct flow". */
1034 uint32_t
1035 miniflow_get(const struct miniflow *flow, unsigned int u32_ofs)
1036 {
1037     return *miniflow_get__(flow, u32_ofs);
1038 }
1039
1040 /* Returns the ovs_be16 that would be at byte offset 'u8_ofs' if 'flow' were
1041  * expanded into a "struct flow". */
1042 static ovs_be16
1043 miniflow_get_be16(const struct miniflow *flow, unsigned int u8_ofs)
1044 {
1045     const uint32_t *u32p = miniflow_get__(flow, u8_ofs / 4);
1046     const ovs_be16 *be16p = (const ovs_be16 *) u32p;
1047     return be16p[u8_ofs % 4 != 0];
1048 }
1049
1050 /* Returns the VID within the vlan_tci member of the "struct flow" represented
1051  * by 'flow'. */
1052 uint16_t
1053 miniflow_get_vid(const struct miniflow *flow)
1054 {
1055     ovs_be16 tci = miniflow_get_be16(flow, offsetof(struct flow, vlan_tci));
1056     return vlan_tci_to_vid(tci);
1057 }
1058
1059 /* Returns true if 'a' and 'b' are the same flow, false otherwise.  */
1060 bool
1061 miniflow_equal(const struct miniflow *a, const struct miniflow *b)
1062 {
1063     int i;
1064
1065     for (i = 0; i < MINI_N_MAPS; i++) {
1066         if (a->map[i] != b->map[i]) {
1067             return false;
1068         }
1069     }
1070
1071     return !memcmp(a->values, b->values,
1072                    miniflow_n_values(a) * sizeof *a->values);
1073 }
1074
1075 /* Returns true if 'a' and 'b' are equal at the places where there are 1-bits
1076  * in 'mask', false if they differ. */
1077 bool
1078 miniflow_equal_in_minimask(const struct miniflow *a, const struct miniflow *b,
1079                            const struct minimask *mask)
1080 {
1081     const uint32_t *p;
1082     int i;
1083
1084     p = mask->masks.values;
1085     for (i = 0; i < MINI_N_MAPS; i++) {
1086         uint32_t map;
1087
1088         for (map = mask->masks.map[i]; map; map = zero_rightmost_1bit(map)) {
1089             int ofs = raw_ctz(map) + i * 32;
1090
1091             if ((miniflow_get(a, ofs) ^ miniflow_get(b, ofs)) & *p) {
1092                 return false;
1093             }
1094             p++;
1095         }
1096     }
1097
1098     return true;
1099 }
1100
1101 /* Returns true if 'a' and 'b' are equal at the places where there are 1-bits
1102  * in 'mask', false if they differ. */
1103 bool
1104 miniflow_equal_flow_in_minimask(const struct miniflow *a, const struct flow *b,
1105                                 const struct minimask *mask)
1106 {
1107     const uint32_t *b_u32 = (const uint32_t *) b;
1108     const uint32_t *p;
1109     int i;
1110
1111     p = mask->masks.values;
1112     for (i = 0; i < MINI_N_MAPS; i++) {
1113         uint32_t map;
1114
1115         for (map = mask->masks.map[i]; map; map = zero_rightmost_1bit(map)) {
1116             int ofs = raw_ctz(map) + i * 32;
1117
1118             if ((miniflow_get(a, ofs) ^ b_u32[ofs]) & *p) {
1119                 return false;
1120             }
1121             p++;
1122         }
1123     }
1124
1125     return true;
1126 }
1127
1128 /* Returns a hash value for 'flow', given 'basis'. */
1129 uint32_t
1130 miniflow_hash(const struct miniflow *flow, uint32_t basis)
1131 {
1132     BUILD_ASSERT_DECL(MINI_N_MAPS == 2);
1133     return hash_3words(flow->map[0], flow->map[1],
1134                        hash_words(flow->values, miniflow_n_values(flow),
1135                                   basis));
1136 }
1137
1138 /* Returns a hash value for the bits of 'flow' where there are 1-bits in
1139  * 'mask', given 'basis'.
1140  *
1141  * The hash values returned by this function are the same as those returned by
1142  * flow_hash_in_minimask(), only the form of the arguments differ. */
1143 uint32_t
1144 miniflow_hash_in_minimask(const struct miniflow *flow,
1145                           const struct minimask *mask, uint32_t basis)
1146 {
1147     const uint32_t *p = mask->masks.values;
1148     uint32_t hash;
1149     int i;
1150
1151     hash = basis;
1152     for (i = 0; i < MINI_N_MAPS; i++) {
1153         uint32_t map;
1154
1155         for (map = mask->masks.map[i]; map; map = zero_rightmost_1bit(map)) {
1156             int ofs = raw_ctz(map) + i * 32;
1157
1158             hash = mhash_add(hash, miniflow_get(flow, ofs) & *p);
1159             p++;
1160         }
1161     }
1162
1163     return mhash_finish(hash, p - mask->masks.values);
1164 }
1165
1166 /* Returns a hash value for the bits of 'flow' where there are 1-bits in
1167  * 'mask', given 'basis'.
1168  *
1169  * The hash values returned by this function are the same as those returned by
1170  * miniflow_hash_in_minimask(), only the form of the arguments differ. */
1171 uint32_t
1172 flow_hash_in_minimask(const struct flow *flow, const struct minimask *mask,
1173                       uint32_t basis)
1174 {
1175     const uint32_t *flow_u32 = (const uint32_t *) flow;
1176     const uint32_t *p = mask->masks.values;
1177     uint32_t hash;
1178     int i;
1179
1180     hash = basis;
1181     for (i = 0; i < MINI_N_MAPS; i++) {
1182         uint32_t map;
1183
1184         for (map = mask->masks.map[i]; map; map = zero_rightmost_1bit(map)) {
1185             int ofs = raw_ctz(map) + i * 32;
1186
1187             hash = mhash_add(hash, flow_u32[ofs] & *p);
1188             p++;
1189         }
1190     }
1191
1192     return mhash_finish(hash, p - mask->masks.values);
1193 }
1194 \f
1195 /* Initializes 'dst' as a copy of 'src'.  The caller must eventually free 'dst'
1196  * with minimask_destroy(). */
1197 void
1198 minimask_init(struct minimask *mask, const struct flow_wildcards *wc)
1199 {
1200     miniflow_init(&mask->masks, &wc->masks);
1201 }
1202
1203 /* Initializes 'dst' as a copy of 'src'.  The caller must eventually free 'dst'
1204  * with minimask_destroy(). */
1205 void
1206 minimask_clone(struct minimask *dst, const struct minimask *src)
1207 {
1208     miniflow_clone(&dst->masks, &src->masks);
1209 }
1210
1211 /* Initializes 'dst_' as the bit-wise "and" of 'a_' and 'b_'.
1212  *
1213  * The caller must provide room for FLOW_U32S "uint32_t"s in 'storage', for use
1214  * by 'dst_'.  The caller must *not* free 'dst_' with minimask_destroy(). */
1215 void
1216 minimask_combine(struct minimask *dst_,
1217                  const struct minimask *a_, const struct minimask *b_,
1218                  uint32_t storage[FLOW_U32S])
1219 {
1220     struct miniflow *dst = &dst_->masks;
1221     const struct miniflow *a = &a_->masks;
1222     const struct miniflow *b = &b_->masks;
1223     int i, n;
1224
1225     n = 0;
1226     dst->values = storage;
1227     for (i = 0; i < MINI_N_MAPS; i++) {
1228         uint32_t map;
1229
1230         dst->map[i] = 0;
1231         for (map = a->map[i] & b->map[i]; map;
1232              map = zero_rightmost_1bit(map)) {
1233             int ofs = raw_ctz(map) + i * 32;
1234             uint32_t mask = miniflow_get(a, ofs) & miniflow_get(b, ofs);
1235
1236             if (mask) {
1237                 dst->map[i] |= rightmost_1bit(map);
1238                 dst->values[n++] = mask;
1239             }
1240         }
1241     }
1242 }
1243
1244 /* Frees any memory owned by 'mask'.  Does not free the storage in which 'mask'
1245  * itself resides; the caller is responsible for that. */
1246 void
1247 minimask_destroy(struct minimask *mask)
1248 {
1249     miniflow_destroy(&mask->masks);
1250 }
1251
1252 /* Initializes 'dst' as a copy of 'src'. */
1253 void
1254 minimask_expand(const struct minimask *mask, struct flow_wildcards *wc)
1255 {
1256     miniflow_expand(&mask->masks, &wc->masks);
1257 }
1258
1259 /* Returns the uint32_t that would be at byte offset '4 * u32_ofs' if 'mask'
1260  * were expanded into a "struct flow_wildcards". */
1261 uint32_t
1262 minimask_get(const struct minimask *mask, unsigned int u32_ofs)
1263 {
1264     return miniflow_get(&mask->masks, u32_ofs);
1265 }
1266
1267 /* Returns the VID mask within the vlan_tci member of the "struct
1268  * flow_wildcards" represented by 'mask'. */
1269 uint16_t
1270 minimask_get_vid_mask(const struct minimask *mask)
1271 {
1272     return miniflow_get_vid(&mask->masks);
1273 }
1274
1275 /* Returns true if 'a' and 'b' are the same flow mask, false otherwise.  */
1276 bool
1277 minimask_equal(const struct minimask *a, const struct minimask *b)
1278 {
1279     return miniflow_equal(&a->masks, &b->masks);
1280 }
1281
1282 /* Returns a hash value for 'mask', given 'basis'. */
1283 uint32_t
1284 minimask_hash(const struct minimask *mask, uint32_t basis)
1285 {
1286     return miniflow_hash(&mask->masks, basis);
1287 }
1288
1289 /* Returns true if at least one bit is wildcarded in 'a_' but not in 'b_',
1290  * false otherwise. */
1291 bool
1292 minimask_has_extra(const struct minimask *a_, const struct minimask *b_)
1293 {
1294     const struct miniflow *a = &a_->masks;
1295     const struct miniflow *b = &b_->masks;
1296     int i;
1297
1298     for (i = 0; i < MINI_N_MAPS; i++) {
1299         uint32_t map;
1300
1301         for (map = a->map[i] | b->map[i]; map;
1302              map = zero_rightmost_1bit(map)) {
1303             int ofs = raw_ctz(map) + i * 32;
1304             uint32_t a_u32 = miniflow_get(a, ofs);
1305             uint32_t b_u32 = miniflow_get(b, ofs);
1306
1307             if ((a_u32 & b_u32) != b_u32) {
1308                 return true;
1309             }
1310         }
1311     }
1312
1313     return false;
1314 }
1315
1316 /* Returns true if 'mask' matches every packet, false if 'mask' fixes any bits
1317  * or fields. */
1318 bool
1319 minimask_is_catchall(const struct minimask *mask_)
1320 {
1321     const struct miniflow *mask = &mask_->masks;
1322
1323     BUILD_ASSERT(MINI_N_MAPS == 2);
1324     return !(mask->map[0] | mask->map[1]);
1325 }