ovs-ofctl: Bug fix in flow_format()
[sliver-openvswitch.git] / lib / match.c
index 2395fb4..91c05a7 100644 (file)
@@ -98,6 +98,8 @@ match_wc_init(struct match *match, const struct flow *flow)
                (flow->dl_type == htons(ETH_TYPE_RARP))) {
         memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src);
         memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst);
+    } else if (eth_type_mpls(flow->dl_type)) {
+        memset(&wc->masks.mpls_lse, 0xff, sizeof wc->masks.mpls_lse);
     }
 
     if (flow->dl_type == htons(ETH_TYPE_ARP) ||
@@ -109,21 +111,22 @@ match_wc_init(struct match *match, const struct flow *flow)
     if (is_ip_any(flow)) {
         memset(&wc->masks.nw_tos, 0xff, sizeof wc->masks.nw_tos);
         memset(&wc->masks.nw_ttl, 0xff, sizeof wc->masks.nw_ttl);
-    }
 
-    if (flow->nw_frag) {
-        memset(&wc->masks.nw_frag, 0xff, sizeof wc->masks.nw_frag);
-    }
+        if (flow->nw_frag) {
+            memset(&wc->masks.nw_frag, 0xff, sizeof wc->masks.nw_frag);
+        }
 
-    if (flow->nw_proto == IPPROTO_ICMP || flow->nw_proto == IPPROTO_ICMPV6 ||
-        (flow->tp_src || flow->tp_dst)) {
-        memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
-        memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst);
-    }
+        if (flow->nw_proto == IPPROTO_ICMP ||
+            flow->nw_proto == IPPROTO_ICMPV6 ||
+            (flow->tp_src || flow->tp_dst)) {
+            memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
+            memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst);
+        }
 
-    if (flow->nw_proto == IPPROTO_ICMPV6) {
-        memset(&wc->masks.arp_sha, 0xff, sizeof wc->masks.arp_sha);
-        memset(&wc->masks.arp_tha, 0xff, sizeof wc->masks.arp_tha);
+        if (flow->nw_proto == IPPROTO_ICMPV6) {
+            memset(&wc->masks.arp_sha, 0xff, sizeof wc->masks.arp_sha);
+            memset(&wc->masks.arp_tha, 0xff, sizeof wc->masks.arp_tha);
+        }
     }
 
     return;
@@ -133,13 +136,9 @@ match_wc_init(struct match *match, const struct flow *flow)
 void
 match_init_exact(struct match *match, const struct flow *flow)
 {
-    ovs_be64 tun_id = flow->tunnel.tun_id;
-
     match->flow = *flow;
     match->flow.skb_priority = 0;
     match->flow.skb_mark = 0;
-    memset(&match->flow.tunnel, 0, sizeof match->flow.tunnel);
-    match->flow.tunnel.tun_id = tun_id;
     flow_wildcards_init_exact(&match->wc);
 }
 
@@ -273,10 +272,10 @@ match_set_tun_flags_masked(struct match *match, uint16_t flags, uint16_t mask)
 }
 
 void
-match_set_in_port(struct match *match, uint16_t ofp_port)
+match_set_in_port(struct match *match, ofp_port_t ofp_port)
 {
-    match->wc.masks.in_port = UINT16_MAX;
-    match->flow.in_port = ofp_port;
+    match->wc.masks.in_port.ofp_port = u16_to_ofp(UINT16_MAX);
+    match->flow.in_port.ofp_port = ofp_port;
 }
 
 void
@@ -818,24 +817,6 @@ format_flow_tunnel(struct ds *s, const struct match *match)
     }
 }
 
-static void
-flow_format_mpls(const struct flow *flow, struct ds *s)
-{
-    if (flow->dl_type == htons(ETH_TYPE_MPLS)) {
-        ds_put_cstr(s, "mpls");
-    } else if (flow->dl_type == htons(ETH_TYPE_MPLS_MCAST)) {
-        ds_put_cstr(s, "mplsm");
-    } else {
-        return;
-    }
-
-    ds_put_format(s, "(label:%"PRIu32",tc:%d,ttl:%d,bos:%d),",
-                  mpls_lse_to_label(flow->mpls_lse),
-                  mpls_lse_to_tc(flow->mpls_lse),
-                  mpls_lse_to_ttl(flow->mpls_lse),
-                  mpls_lse_to_bos(flow->mpls_lse));
-}
-
 /* Appends a string representation of 'match' to 's'.  If 'priority' is
  * different from OFP_DEFAULT_PRIORITY, includes it in 's'. */
 void
@@ -849,7 +830,7 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)
 
     int i;
 
-    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 19);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 20);
 
     if (priority != OFP_DEFAULT_PRIORITY) {
         ds_put_format(s, "priority=%u,", priority);
@@ -901,8 +882,10 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)
             ds_put_cstr(s, "arp,");
         } else if (f->dl_type == htons(ETH_TYPE_RARP)) {
             ds_put_cstr(s, "rarp,");
-        } else if (f->mpls_depth) {
-            flow_format_mpls(f, s);
+        } else if (f->dl_type == htons(ETH_TYPE_MPLS)) {
+            ds_put_cstr(s, "mpls,");
+        } else if (f->dl_type == htons(ETH_TYPE_MPLS_MCAST)) {
+            ds_put_cstr(s, "mplsm,");
         } else {
             skip_type = false;
         }
@@ -934,9 +917,9 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)
                       ntohll(f->metadata), ntohll(wc->masks.metadata));
         break;
     }
-    if (wc->masks.in_port) {
+    if (wc->masks.in_port.ofp_port) {
         ds_put_cstr(s, "in_port=");
-        ofputil_format_port(f->in_port, s);
+        ofputil_format_port(f->in_port.ofp_port, s);
         ds_put_char(s, ',');
     }
     if (wc->masks.vlan_tci) {
@@ -1019,6 +1002,10 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)
         ds_put_format(s, "mpls_tc=%"PRIu8",",
                  mpls_lse_to_tc(f->mpls_lse));
     }
+    if (wc->masks.mpls_lse & htonl(MPLS_TTL_MASK)) {
+        ds_put_format(s, "mpls_ttl=%"PRIu8",",
+                 mpls_lse_to_ttl(f->mpls_lse));
+    }
     if (wc->masks.mpls_lse & htonl(MPLS_BOS_MASK)) {
         ds_put_format(s, "mpls_bos=%"PRIu8",",
                  mpls_lse_to_bos(f->mpls_lse));
@@ -1053,8 +1040,7 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)
                             &wc->masks.nd_target);
         format_eth_masked(s, "nd_sll", f->arp_sha, wc->masks.arp_sha);
         format_eth_masked(s, "nd_tll", f->arp_tha, wc->masks.arp_tha);
-    } else if (f->nw_proto == IPPROTO_TCP ||
-               f->nw_proto == IPPROTO_UDP) {
+    } else {
         format_be16_masked(s, "tp_src", f->tp_src, wc->masks.tp_src);
         format_be16_masked(s, "tp_dst", f->tp_dst, wc->masks.tp_dst);
     }