{
MFF_IP_PROTO, "nw_proto", NULL,
MF_FIELD_SIZES(u8),
- MFM_NONE, FWW_NW_PROTO,
+ MFM_NONE, 0,
MFS_DECIMAL,
MFP_IP_ANY,
false,
{
MFF_ARP_OP, "arp_op", NULL,
MF_FIELD_SIZES(be16),
- MFM_NONE, FWW_NW_PROTO,
+ MFM_NONE, 0,
MFS_DECIMAL,
MFP_ARP,
false,
switch (mf->id) {
case MFF_IN_PORT:
case MFF_ETH_TYPE:
- case MFF_IP_PROTO:
- case MFF_ARP_OP:
assert(mf->fww_bit != 0);
return (wc->wildcards & mf->fww_bit) != 0;
case MFF_IPV6_LABEL:
return !wc->ipv6_label_mask;
+ case MFF_IP_PROTO:
+ return !wc->nw_proto_mask;
case MFF_IP_DSCP:
return !(wc->nw_tos_mask & IP_DSCP_MASK);
case MFF_IP_ECN:
case MFF_IP_FRAG:
return !(wc->nw_frag_mask & FLOW_NW_FRAG_MASK);
+ case MFF_ARP_OP:
+ return !wc->nw_proto_mask;
case MFF_ARP_SPA:
return !wc->nw_src_mask;
case MFF_ARP_TPA:
switch (mf->id) {
case MFF_IN_PORT:
case MFF_ETH_TYPE:
- case MFF_IP_PROTO:
- case MFF_ARP_OP:
assert(mf->fww_bit != 0);
memset(mask, wc->wildcards & mf->fww_bit ? 0x00 : 0xff, mf->n_bytes);
break;
mask->be32 = wc->ipv6_label_mask;
break;
+ case MFF_IP_PROTO:
+ mask->u8 = wc->nw_proto_mask;
+ break;
case MFF_IP_DSCP:
mask->u8 = wc->nw_tos_mask & IP_DSCP_MASK;
break;
mask->u8 = wc->nw_frag_mask & FLOW_NW_FRAG_MASK;
break;
+ case MFF_ARP_OP:
+ mask->u8 = wc->nw_proto_mask;
+ break;
case MFF_ARP_SPA:
mask->be32 = wc->nw_src_mask;
break;
break;
case MFF_IP_PROTO:
- rule->wc.wildcards |= FWW_NW_PROTO;
+ rule->wc.nw_proto_mask = 0;
rule->flow.nw_proto = 0;
break;
break;
case MFF_ARP_OP:
- rule->wc.wildcards |= FWW_NW_PROTO;
+ rule->wc.nw_proto_mask = 0;
rule->flow.nw_proto = 0;
break;