configure: Remove --with-build-number.
[sliver-openvswitch.git] / lib / meta-flow.c
index a0e2aa8..11d27b1 100644 (file)
@@ -91,6 +91,15 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
     REGISTER(4),
 #endif
 #if FLOW_N_REGS > 5
+    REGISTER(5),
+#endif
+#if FLOW_N_REGS > 6
+    REGISTER(6),
+#endif
+#if FLOW_N_REGS > 7
+    REGISTER(7),
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
 
@@ -290,7 +299,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
     {
         MFF_TCP_SRC, "tcp_src", "tp_src",
         MF_FIELD_SIZES(be16),
-        MFM_NONE, FWW_TP_SRC,
+        MFM_FULLY, 0,
         MFS_DECIMAL,
         MFP_TCP,
         true,
@@ -298,7 +307,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
     }, {
         MFF_TCP_DST, "tcp_dst", "tp_dst",
         MF_FIELD_SIZES(be16),
-        MFM_NONE, FWW_TP_DST,
+        MFM_FULLY, 0,
         MFS_DECIMAL,
         MFP_TCP,
         true,
@@ -308,7 +317,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
     {
         MFF_UDP_SRC, "udp_src", NULL,
         MF_FIELD_SIZES(be16),
-        MFM_NONE, FWW_TP_SRC,
+        MFM_FULLY, 0,
         MFS_DECIMAL,
         MFP_UDP,
         true,
@@ -316,7 +325,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
     }, {
         MFF_UDP_DST, "udp_dst", NULL,
         MF_FIELD_SIZES(be16),
-        MFM_NONE, FWW_TP_DST,
+        MFM_FULLY, 0,
         MFS_DECIMAL,
         MFP_UDP,
         true,
@@ -326,7 +335,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
     {
         MFF_ICMPV4_TYPE, "icmp_type", NULL,
         MF_FIELD_SIZES(u8),
-        MFM_NONE, FWW_TP_SRC,
+        MFM_NONE, 0,
         MFS_DECIMAL,
         MFP_ICMPV4,
         false,
@@ -334,7 +343,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
     }, {
         MFF_ICMPV4_CODE, "icmp_code", NULL,
         MF_FIELD_SIZES(u8),
-        MFM_NONE, FWW_TP_DST,
+        MFM_NONE, 0,
         MFS_DECIMAL,
         MFP_ICMPV4,
         false,
@@ -344,7 +353,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
     {
         MFF_ICMPV6_TYPE, "icmpv6_type", NULL,
         MF_FIELD_SIZES(u8),
-        MFM_NONE, FWW_TP_SRC,
+        MFM_NONE, 0,
         MFS_DECIMAL,
         MFP_ICMPV6,
         false,
@@ -352,7 +361,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
     }, {
         MFF_ICMPV6_CODE, "icmpv6_code", NULL,
         MF_FIELD_SIZES(u8),
-        MFM_NONE, FWW_TP_DST,
+        MFM_NONE, 0,
         MFS_DECIMAL,
         MFP_ICMPV6,
         false,
@@ -509,14 +518,6 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)
     case MFF_ARP_OP:
     case MFF_ARP_SHA:
     case MFF_ARP_THA:
-    case MFF_TCP_SRC:
-    case MFF_TCP_DST:
-    case MFF_UDP_SRC:
-    case MFF_UDP_DST:
-    case MFF_ICMPV4_TYPE:
-    case MFF_ICMPV4_CODE:
-    case MFF_ICMPV6_TYPE:
-    case MFF_ICMPV6_CODE:
     case MFF_ND_TARGET:
     case MFF_ND_SLL:
     case MFF_ND_TLL:
@@ -542,6 +543,15 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)
     case MFF_REG4:
 #endif
 #if FLOW_N_REGS > 5
+    case MFF_REG5:
+#endif
+#if FLOW_N_REGS > 6
+    case MFF_REG6:
+#endif
+#if FLOW_N_REGS > 7
+    case MFF_REG7:
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
         return !wc->reg_masks[mf->id - MFF_REG0];
@@ -575,6 +585,17 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)
     case MFF_ARP_TPA:
         return !wc->nw_dst_mask;
 
+    case MFF_TCP_SRC:
+    case MFF_UDP_SRC:
+    case MFF_ICMPV4_TYPE:
+    case MFF_ICMPV6_TYPE:
+        return !wc->tp_src_mask;
+    case MFF_TCP_DST:
+    case MFF_UDP_DST:
+    case MFF_ICMPV4_CODE:
+    case MFF_ICMPV6_CODE:
+        return !wc->tp_dst_mask;
+
     case MFF_N_IDS:
     default:
         NOT_REACHED();
@@ -603,14 +624,6 @@ mf_get_mask(const struct mf_field *mf, const struct flow_wildcards *wc,
     case MFF_ARP_OP:
     case MFF_ARP_SHA:
     case MFF_ARP_THA:
-    case MFF_TCP_SRC:
-    case MFF_TCP_DST:
-    case MFF_UDP_SRC:
-    case MFF_UDP_DST:
-    case MFF_ICMPV4_TYPE:
-    case MFF_ICMPV4_CODE:
-    case MFF_ICMPV6_TYPE:
-    case MFF_ICMPV6_CODE:
     case MFF_ND_TARGET:
     case MFF_ND_SLL:
     case MFF_ND_TLL:
@@ -638,6 +651,15 @@ mf_get_mask(const struct mf_field *mf, const struct flow_wildcards *wc,
     case MFF_REG4:
 #endif
 #if FLOW_N_REGS > 5
+    case MFF_REG5:
+#endif
+#if FLOW_N_REGS > 6
+    case MFF_REG6:
+#endif
+#if FLOW_N_REGS > 7
+    case MFF_REG7:
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
         mask->be32 = htonl(wc->reg_masks[mf->id - MFF_REG0]);
@@ -683,6 +705,24 @@ mf_get_mask(const struct mf_field *mf, const struct flow_wildcards *wc,
         mask->be32 = wc->nw_dst_mask;
         break;
 
+    case MFF_TCP_SRC:
+    case MFF_UDP_SRC:
+        mask->be16 = wc->tp_src_mask;
+        break;
+    case MFF_TCP_DST:
+    case MFF_UDP_DST:
+        mask->be16 = wc->tp_dst_mask;
+        break;
+
+    case MFF_ICMPV4_TYPE:
+    case MFF_ICMPV6_TYPE:
+        mask->u8 = ntohs(wc->tp_src_mask);
+        break;
+    case MFF_ICMPV4_CODE:
+    case MFF_ICMPV6_CODE:
+        mask->u8 = ntohs(wc->tp_dst_mask);
+        break;
+
     case MFF_N_IDS:
     default:
         NOT_REACHED();
@@ -811,6 +851,15 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value)
     case MFF_REG4:
 #endif
 #if FLOW_N_REGS > 5
+    case MFF_REG5:
+#endif
+#if FLOW_N_REGS > 6
+    case MFF_REG6:
+#endif
+#if FLOW_N_REGS > 7
+    case MFF_REG7:
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
     case MFF_ETH_SRC:
@@ -896,6 +945,15 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow,
     case MFF_REG4:
 #endif
 #if FLOW_N_REGS > 5
+    case MFF_REG5:
+#endif
+#if FLOW_N_REGS > 6
+    case MFF_REG6:
+#endif
+#if FLOW_N_REGS > 7
+    case MFF_REG7:
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
         value->be32 = htonl(flow->regs[mf->id - MFF_REG0]);
@@ -1055,6 +1113,15 @@ mf_set_value(const struct mf_field *mf,
     case MFF_REG4:
 #endif
 #if FLOW_N_REGS > 5
+    case MFF_REG5:
+#endif
+#if FLOW_N_REGS > 6
+    case MFF_REG6:
+#endif
+#if FLOW_N_REGS > 7
+    case MFF_REG7:
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
 #if FLOW_N_REGS > 0
@@ -1216,6 +1283,15 @@ mf_set_flow_value(const struct mf_field *mf,
     case MFF_REG4:
 #endif
 #if FLOW_N_REGS > 5
+    case MFF_REG5:
+#endif
+#if FLOW_N_REGS > 6
+    case MFF_REG6:
+#endif
+#if FLOW_N_REGS > 7
+    case MFF_REG7:
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
 #if FLOW_N_REGS > 0
@@ -1384,6 +1460,21 @@ mf_set_wild(const struct mf_field *mf, struct cls_rule *rule)
         break;
 #endif
 #if FLOW_N_REGS > 5
+    case MFF_REG5:
+        cls_rule_set_reg_masked(rule, 5, 0, 0);
+        break;
+#endif
+#if FLOW_N_REGS > 6
+    case MFF_REG6:
+        cls_rule_set_reg_masked(rule, 6, 0, 0);
+        break;
+#endif
+#if FLOW_N_REGS > 7
+    case MFF_REG7:
+        cls_rule_set_reg_masked(rule, 7, 0, 0);
+        break;
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
 
@@ -1485,7 +1576,7 @@ mf_set_wild(const struct mf_field *mf, struct cls_rule *rule)
     case MFF_UDP_SRC:
     case MFF_ICMPV4_TYPE:
     case MFF_ICMPV6_TYPE:
-        rule->wc.wildcards |= FWW_TP_SRC;
+        rule->wc.tp_src_mask = htons(0);
         rule->flow.tp_src = htons(0);
         break;
 
@@ -1493,7 +1584,7 @@ mf_set_wild(const struct mf_field *mf, struct cls_rule *rule)
     case MFF_UDP_DST:
     case MFF_ICMPV4_CODE:
     case MFF_ICMPV6_CODE:
-        rule->wc.wildcards |= FWW_TP_DST;
+        rule->wc.tp_dst_mask = htons(0);
         rule->flow.tp_dst = htons(0);
         break;
 
@@ -1546,10 +1637,6 @@ mf_set(const struct mf_field *mf,
     case MFF_ARP_OP:
     case MFF_ARP_SHA:
     case MFF_ARP_THA:
-    case MFF_TCP_SRC:
-    case MFF_TCP_DST:
-    case MFF_UDP_SRC:
-    case MFF_UDP_DST:
     case MFF_ICMPV4_TYPE:
     case MFF_ICMPV4_CODE:
     case MFF_ICMPV6_TYPE:
@@ -1579,6 +1666,15 @@ mf_set(const struct mf_field *mf,
     case MFF_REG4:
 #endif
 #if FLOW_N_REGS > 5
+    case MFF_REG5:
+#endif
+#if FLOW_N_REGS > 6
+    case MFF_REG6:
+#endif
+#if FLOW_N_REGS > 7
+    case MFF_REG7:
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
         cls_rule_set_reg_masked(rule, mf->id - MFF_REG0,
@@ -1623,6 +1719,16 @@ mf_set(const struct mf_field *mf,
         cls_rule_set_nw_dst_masked(rule, value->be32, mask->be32);
         break;
 
+    case MFF_TCP_SRC:
+    case MFF_UDP_SRC:
+        cls_rule_set_tp_src_masked(rule, value->be16, mask->be16);
+        break;
+
+    case MFF_TCP_DST:
+    case MFF_UDP_DST:
+        cls_rule_set_tp_dst_masked(rule, value->be16, mask->be16);
+        break;
+
     case MFF_N_IDS:
     default:
         NOT_REACHED();
@@ -1713,6 +1819,15 @@ mf_random_value(const struct mf_field *mf, union mf_value *value)
     case MFF_REG4:
 #endif
 #if FLOW_N_REGS > 5
+    case MFF_REG5:
+#endif
+#if FLOW_N_REGS > 6
+    case MFF_REG6:
+#endif
+#if FLOW_N_REGS > 7
+    case MFF_REG7:
+#endif
+#if FLOW_N_REGS > 8
 #error
 #endif
     case MFF_ETH_SRC:
@@ -2228,7 +2343,7 @@ mf_format_subfield(const struct mf_subfield *sf, struct ds *s)
         ds_put_cstr(s, sf->field->name);
     }
 
-    if (sf->ofs == 0 && sf->n_bits == sf->field->n_bits) {
+    if (sf->field && sf->ofs == 0 && sf->n_bits == sf->field->n_bits) {
         ds_put_cstr(s, "[]");
     } else if (sf->n_bits == 1) {
         ds_put_format(s, "[%d]", sf->ofs);