/*
- * Copyright (c) 2011, 2012, 2013 Nicira, Inc.
+ * Copyright (c) 2011, 2012, 2013, 2014 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
VLOG_DEFINE_THIS_MODULE(meta_flow);
+#define FLOW_U32OFS(FIELD) \
+ offsetof(struct flow, FIELD) % 4 ? -1 : offsetof(struct flow, FIELD) / 4
+
#define MF_FIELD_SIZES(MEMBER) \
sizeof ((union mf_value *)0)->MEMBER, \
8 * sizeof ((union mf_value *)0)->MEMBER
/* ## -------- ## */
{
+ MFF_DP_HASH, "dp_hash", NULL,
+ MF_FIELD_SIZES(be32),
+ MFM_FULLY,
+ MFS_HEXADECIMAL,
+ MFP_NONE,
+ false,
+ NXM_NX_DP_HASH, "NXM_NX_DP_HASH",
+ NXM_NX_DP_HASH, "NXM_NX_DP_HASH", 0,
+ OFPUTIL_P_NXM_OXM_ANY,
+ OFPUTIL_P_NXM_OXM_ANY,
+ -1,
+ }, {
+ MFF_RECIRC_ID, "recirc_id", NULL,
+ MF_FIELD_SIZES(be32),
+ MFM_NONE,
+ MFS_DECIMAL,
+ MFP_NONE,
+ false,
+ NXM_NX_RECIRC_ID, "NXM_NX_RECIRC_ID",
+ NXM_NX_RECIRC_ID, "NXM_NX_RECIRC_ID", 0,
+ OFPUTIL_P_NXM_OXM_ANY,
+ OFPUTIL_P_NXM_OXM_ANY,
+ -1,
+ }, {
MFF_TUN_ID, "tun_id", "tunnel_id",
MF_FIELD_SIZES(be64),
MFM_FULLY,
MFP_NONE,
true,
NXM_NX_TUN_ID, "NXM_NX_TUN_ID",
- OXM_OF_TUNNEL_ID, "OXM_OF_TUNNEL_ID",
+ OXM_OF_TUNNEL_ID, "OXM_OF_TUNNEL_ID", OFP13_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ FLOW_U32OFS(tunnel.tun_id),
}, {
MFF_TUN_SRC, "tun_src", NULL,
MF_FIELD_SIZES(be32),
MFP_NONE,
true,
NXM_NX_TUN_IPV4_SRC, "NXM_NX_TUN_IPV4_SRC",
- NXM_NX_TUN_IPV4_SRC, "NXM_NX_TUN_IPV4_SRC",
+ NXM_NX_TUN_IPV4_SRC, "NXM_NX_TUN_IPV4_SRC", 0,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ FLOW_U32OFS(tunnel.ip_src),
}, {
MFF_TUN_DST, "tun_dst", NULL,
MF_FIELD_SIZES(be32),
MFP_NONE,
true,
NXM_NX_TUN_IPV4_DST, "NXM_NX_TUN_IPV4_DST",
- NXM_NX_TUN_IPV4_DST, "NXM_NX_TUN_IPV4_DST",
+ NXM_NX_TUN_IPV4_DST, "NXM_NX_TUN_IPV4_DST", 0,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ FLOW_U32OFS(tunnel.ip_dst),
}, {
MFF_TUN_FLAGS, "tun_flags", NULL,
MF_FIELD_SIZES(be16),
MFP_NONE,
false,
0, NULL,
- 0, NULL,
+ 0, NULL, 0,
OFPUTIL_P_NONE,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_TUN_TTL, "tun_ttl", NULL,
MF_FIELD_SIZES(u8),
MFP_NONE,
false,
0, NULL,
- 0, NULL,
+ 0, NULL, 0,
OFPUTIL_P_NONE,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_TUN_TOS, "tun_tos", NULL,
MF_FIELD_SIZES(u8),
MFP_NONE,
false,
0, NULL,
- 0, NULL,
+ 0, NULL, 0,
OFPUTIL_P_NONE,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_METADATA, "metadata", NULL,
MF_FIELD_SIZES(be64),
MFP_NONE,
true,
OXM_OF_METADATA, "OXM_OF_METADATA",
- OXM_OF_METADATA, "OXM_OF_METADATA",
+ OXM_OF_METADATA, "OXM_OF_METADATA", OFP12_VERSION,
OFPUTIL_P_NXM_OF11_UP,
OFPUTIL_P_NXM_OF11_UP,
+ -1,
}, {
MFF_IN_PORT, "in_port", NULL,
MF_FIELD_SIZES(be16),
MFP_NONE,
true,
NXM_OF_IN_PORT, "NXM_OF_IN_PORT",
- NXM_OF_IN_PORT, "NXM_OF_IN_PORT",
+ NXM_OF_IN_PORT, "NXM_OF_IN_PORT", 0,
OFPUTIL_P_ANY, /* OF11+ via mapping to 32 bits. */
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_IN_PORT_OXM, "in_port_oxm", NULL,
MF_FIELD_SIZES(be32),
MFP_NONE,
true,
OXM_OF_IN_PORT, "OXM_OF_IN_PORT",
- OXM_OF_IN_PORT, "OXM_OF_IN_PORT",
+ OXM_OF_IN_PORT, "OXM_OF_IN_PORT", OFP12_VERSION,
OFPUTIL_P_OF11_UP,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_SKB_PRIORITY, "skb_priority", NULL,
MF_FIELD_SIZES(be32),
MFP_NONE,
false,
0, NULL,
- 0, NULL,
+ 0, NULL, 0,
OFPUTIL_P_NONE,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_PKT_MARK, "pkt_mark", NULL,
MF_FIELD_SIZES(be32),
MFP_NONE,
true,
NXM_NX_PKT_MARK, "NXM_NX_PKT_MARK",
- NXM_NX_PKT_MARK, "NXM_NX_PKT_MARK",
+ NXM_NX_PKT_MARK, "NXM_NX_PKT_MARK", 0,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
},
#define REGISTER(IDX) \
MFP_NONE, \
true, \
NXM_NX_REG(IDX), "NXM_NX_REG" #IDX, \
- NXM_NX_REG(IDX), "NXM_NX_REG" #IDX, \
+ NXM_NX_REG(IDX), "NXM_NX_REG" #IDX, 0, \
OFPUTIL_P_NXM_OXM_ANY, \
OFPUTIL_P_NXM_OXM_ANY, \
+ -1, \
}
#if FLOW_N_REGS > 0
REGISTER(0),
MFP_NONE,
true,
NXM_OF_ETH_SRC, "NXM_OF_ETH_SRC",
- OXM_OF_ETH_SRC, "OXM_OF_ETH_SRC",
+ OXM_OF_ETH_SRC, "OXM_OF_ETH_SRC", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OF11_UP, /* Bitwise masking only with NXM and OF11+! */
+ -1,
}, {
MFF_ETH_DST, "eth_dst", "dl_dst",
MF_FIELD_SIZES(mac),
MFP_NONE,
true,
NXM_OF_ETH_DST, "NXM_OF_ETH_DST",
- OXM_OF_ETH_DST, "OXM_OF_ETH_DST",
+ OXM_OF_ETH_DST, "OXM_OF_ETH_DST", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OF11_UP, /* Bitwise masking only with NXM and OF11+! */
+ -1,
}, {
MFF_ETH_TYPE, "eth_type", "dl_type",
MF_FIELD_SIZES(be16),
MFP_NONE,
false,
NXM_OF_ETH_TYPE, "NXM_OF_ETH_TYPE",
- OXM_OF_ETH_TYPE, "OXM_OF_ETH_TYPE",
+ OXM_OF_ETH_TYPE, "OXM_OF_ETH_TYPE", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NONE,
+ -1,
},
{
MFP_NONE,
true,
NXM_OF_VLAN_TCI, "NXM_OF_VLAN_TCI",
- NXM_OF_VLAN_TCI, "NXM_OF_VLAN_TCI",
+ NXM_OF_VLAN_TCI, "NXM_OF_VLAN_TCI", 0,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_DL_VLAN, "dl_vlan", NULL,
sizeof(ovs_be16), 12,
MFP_NONE,
true,
0, NULL,
- 0, NULL,
+ 0, NULL, 0,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_VLAN_VID, "vlan_vid", NULL,
sizeof(ovs_be16), 12,
MFP_NONE,
true,
OXM_OF_VLAN_VID, "OXM_OF_VLAN_VID",
- OXM_OF_VLAN_VID, "OXM_OF_VLAN_VID",
+ OXM_OF_VLAN_VID, "OXM_OF_VLAN_VID", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_DL_VLAN_PCP, "dl_vlan_pcp", NULL,
1, 3,
MFP_NONE,
true,
0, NULL,
- 0, NULL,
+ 0, NULL, 0,
OFPUTIL_P_ANY, /* Will be mapped to NXM and OXM. */
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_VLAN_PCP, "vlan_pcp", NULL,
1, 3,
MFP_VLAN_VID,
true,
OXM_OF_VLAN_PCP, "OXM_OF_VLAN_PCP",
- OXM_OF_VLAN_PCP, "OXM_OF_VLAN_PCP",
+ OXM_OF_VLAN_PCP, "OXM_OF_VLAN_PCP", OFP12_VERSION,
OFPUTIL_P_ANY, /* Will be mapped to OF10 and NXM. */
OFPUTIL_P_NONE,
+ -1,
},
/* ## ---- ## */
MFP_MPLS,
true,
OXM_OF_MPLS_LABEL, "OXM_OF_MPLS_LABEL",
- OXM_OF_MPLS_LABEL, "OXM_OF_MPLS_LABEL",
+ OXM_OF_MPLS_LABEL, "OXM_OF_MPLS_LABEL", OFP12_VERSION,
OFPUTIL_P_NXM_OF11_UP,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_MPLS_TC, "mpls_tc", NULL,
1, 3,
MFP_MPLS,
true,
OXM_OF_MPLS_TC, "OXM_OF_MPLS_TC",
- OXM_OF_MPLS_TC, "OXM_OF_MPLS_TC",
+ OXM_OF_MPLS_TC, "OXM_OF_MPLS_TC", OFP12_VERSION,
OFPUTIL_P_NXM_OF11_UP,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_MPLS_BOS, "mpls_bos", NULL,
1, 1,
MFP_MPLS,
false,
OXM_OF_MPLS_BOS, "OXM_OF_MPLS_BOS",
- OXM_OF_MPLS_BOS, "OXM_OF_MPLS_BOS",
+ OXM_OF_MPLS_BOS, "OXM_OF_MPLS_BOS", OFP13_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NONE,
+ -1,
},
/* ## -- ## */
MFP_IPV4,
true,
NXM_OF_IP_SRC, "NXM_OF_IP_SRC",
- OXM_OF_IPV4_SRC, "OXM_OF_IPV4_SRC",
+ OXM_OF_IPV4_SRC, "OXM_OF_IPV4_SRC", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OF11_UP,
+ FLOW_U32OFS(nw_src),
}, {
MFF_IPV4_DST, "ip_dst", "nw_dst",
MF_FIELD_SIZES(be32),
MFP_IPV4,
true,
NXM_OF_IP_DST, "NXM_OF_IP_DST",
- OXM_OF_IPV4_DST, "OXM_OF_IPV4_DST",
+ OXM_OF_IPV4_DST, "OXM_OF_IPV4_DST", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OF11_UP,
+ FLOW_U32OFS(nw_dst),
},
{
MFP_IPV6,
true,
NXM_NX_IPV6_SRC, "NXM_NX_IPV6_SRC",
- OXM_OF_IPV6_SRC, "OXM_OF_IPV6_SRC",
+ OXM_OF_IPV6_SRC, "OXM_OF_IPV6_SRC", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ FLOW_U32OFS(ipv6_src),
}, {
MFF_IPV6_DST, "ipv6_dst", NULL,
MF_FIELD_SIZES(ipv6),
MFP_IPV6,
true,
NXM_NX_IPV6_DST, "NXM_NX_IPV6_DST",
- OXM_OF_IPV6_DST, "OXM_OF_IPV6_DST",
+ OXM_OF_IPV6_DST, "OXM_OF_IPV6_DST", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ FLOW_U32OFS(ipv6_dst),
},
{
MFF_IPV6_LABEL, "ipv6_label", NULL,
MFP_IPV6,
false,
NXM_NX_IPV6_LABEL, "NXM_NX_IPV6_LABEL",
- OXM_OF_IPV6_FLABEL, "OXM_OF_IPV6_FLABEL",
+ OXM_OF_IPV6_FLABEL, "OXM_OF_IPV6_FLABEL", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
},
{
MFP_IP_ANY,
false,
NXM_OF_IP_PROTO, "NXM_OF_IP_PROTO",
- OXM_OF_IP_PROTO, "OXM_OF_IP_PROTO",
+ OXM_OF_IP_PROTO, "OXM_OF_IP_PROTO", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_IP_DSCP, "nw_tos", NULL,
MF_FIELD_SIZES(u8),
MFP_IP_ANY,
true,
NXM_OF_IP_TOS, "NXM_OF_IP_TOS",
- NXM_OF_IP_TOS, "NXM_OF_IP_TOS",
+ NXM_OF_IP_TOS, "NXM_OF_IP_TOS", 0,
OFPUTIL_P_ANY, /* Will be shifted for OXM. */
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_IP_DSCP_SHIFTED, "ip_dscp", NULL,
1, 6,
MFP_IP_ANY,
true,
OXM_OF_IP_DSCP, "OXM_OF_IP_DSCP",
- OXM_OF_IP_DSCP, "OXM_OF_IP_DSCP",
+ OXM_OF_IP_DSCP, "OXM_OF_IP_DSCP", OFP12_VERSION,
OFPUTIL_P_ANY, /* Will be shifted for non-OXM. */
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_IP_ECN, "nw_ecn", "ip_ecn",
1, 2,
MFP_IP_ANY,
true,
NXM_NX_IP_ECN, "NXM_NX_IP_ECN",
- OXM_OF_IP_ECN, "OXM_OF_IP_ECN",
+ OXM_OF_IP_ECN, "OXM_OF_IP_ECN", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_IP_TTL, "nw_ttl", NULL,
MF_FIELD_SIZES(u8),
MFP_IP_ANY,
true,
NXM_NX_IP_TTL, "NXM_NX_IP_TTL",
- NXM_NX_IP_TTL, "NXM_NX_IP_TTL",
+ NXM_NX_IP_TTL, "NXM_NX_IP_TTL", 0,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_IP_FRAG, "ip_frag", NULL,
1, 2,
MFP_IP_ANY,
false,
NXM_NX_IP_FRAG, "NXM_NX_IP_FRAG",
- NXM_NX_IP_FRAG, "NXM_NX_IP_FRAG",
+ NXM_NX_IP_FRAG, "NXM_NX_IP_FRAG", 0,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
},
{
MFP_ARP,
true,
NXM_OF_ARP_OP, "NXM_OF_ARP_OP",
- OXM_OF_ARP_OP, "OXM_OF_ARP_OP",
+ OXM_OF_ARP_OP, "OXM_OF_ARP_OP", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_ARP_SPA, "arp_spa", NULL,
MF_FIELD_SIZES(be32),
MFP_ARP,
true,
NXM_OF_ARP_SPA, "NXM_OF_ARP_SPA",
- OXM_OF_ARP_SPA, "OXM_OF_ARP_SPA",
+ OXM_OF_ARP_SPA, "OXM_OF_ARP_SPA", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OF11_UP,
+ -1,
}, {
MFF_ARP_TPA, "arp_tpa", NULL,
MF_FIELD_SIZES(be32),
MFP_ARP,
true,
NXM_OF_ARP_TPA, "NXM_OF_ARP_TPA",
- OXM_OF_ARP_TPA, "OXM_OF_ARP_TPA",
+ OXM_OF_ARP_TPA, "OXM_OF_ARP_TPA", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OF11_UP,
+ -1,
}, {
MFF_ARP_SHA, "arp_sha", NULL,
MF_FIELD_SIZES(mac),
MFP_ARP,
true,
NXM_NX_ARP_SHA, "NXM_NX_ARP_SHA",
- OXM_OF_ARP_SHA, "OXM_OF_ARP_SHA",
+ OXM_OF_ARP_SHA, "OXM_OF_ARP_SHA", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_ARP_THA, "arp_tha", NULL,
MF_FIELD_SIZES(mac),
MFP_ARP,
true,
NXM_NX_ARP_THA, "NXM_NX_ARP_THA",
- OXM_OF_ARP_THA, "OXM_OF_ARP_THA",
+ OXM_OF_ARP_THA, "OXM_OF_ARP_THA", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
},
/* ## -- ## */
MFP_TCP,
true,
NXM_OF_TCP_SRC, "NXM_OF_TCP_SRC",
- OXM_OF_TCP_SRC, "OXM_OF_TCP_SRC",
+ OXM_OF_TCP_SRC, "OXM_OF_TCP_SRC", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_TCP_DST, "tcp_dst", "tp_dst",
MF_FIELD_SIZES(be16),
MFP_TCP,
true,
NXM_OF_TCP_DST, "NXM_OF_TCP_DST",
- OXM_OF_TCP_DST, "OXM_OF_TCP_DST",
+ OXM_OF_TCP_DST, "OXM_OF_TCP_DST", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_TCP_FLAGS, "tcp_flags", NULL,
2, 12,
MFP_TCP,
false,
NXM_NX_TCP_FLAGS, "NXM_NX_TCP_FLAGS",
- NXM_NX_TCP_FLAGS, "NXM_NX_TCP_FLAGS",
+ OXM_OF_TCP_FLAGS, "OXM_OF_TCP_FLAGS", OFP15_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
},
{
MFP_UDP,
true,
NXM_OF_UDP_SRC, "NXM_OF_UDP_SRC",
- OXM_OF_UDP_SRC, "OXM_OF_UDP_SRC",
+ OXM_OF_UDP_SRC, "OXM_OF_UDP_SRC", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_UDP_DST, "udp_dst", NULL,
MF_FIELD_SIZES(be16),
MFP_UDP,
true,
NXM_OF_UDP_DST, "NXM_OF_UDP_DST",
- OXM_OF_UDP_DST, "OXM_OF_UDP_DST",
+ OXM_OF_UDP_DST, "OXM_OF_UDP_DST", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
},
{
MFP_SCTP,
true,
OXM_OF_SCTP_SRC, "OXM_OF_SCTP_SRC",
- OXM_OF_SCTP_SRC, "OXM_OF_SCTP_SRC",
+ OXM_OF_SCTP_SRC, "OXM_OF_SCTP_SRC", OFP12_VERSION,
OFPUTIL_P_NXM_OF11_UP,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_SCTP_DST, "sctp_dst", NULL,
MF_FIELD_SIZES(be16),
MFP_SCTP,
true,
OXM_OF_SCTP_DST, "OXM_OF_SCTP_DST",
- OXM_OF_SCTP_DST, "OXM_OF_SCTP_DST",
+ OXM_OF_SCTP_DST, "OXM_OF_SCTP_DST", OFP12_VERSION,
OFPUTIL_P_NXM_OF11_UP,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
},
{
MFP_ICMPV4,
false,
NXM_OF_ICMP_TYPE, "NXM_OF_ICMP_TYPE",
- OXM_OF_ICMPV4_TYPE, "OXM_OF_ICMPV4_TYPE",
+ OXM_OF_ICMPV4_TYPE, "OXM_OF_ICMPV4_TYPE", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_ICMPV4_CODE, "icmp_code", NULL,
MF_FIELD_SIZES(u8),
MFP_ICMPV4,
false,
NXM_OF_ICMP_CODE, "NXM_OF_ICMP_CODE",
- OXM_OF_ICMPV4_CODE, "OXM_OF_ICMPV4_CODE",
+ OXM_OF_ICMPV4_CODE, "OXM_OF_ICMPV4_CODE", OFP12_VERSION,
OFPUTIL_P_ANY,
OFPUTIL_P_NONE,
+ -1,
},
{
MFP_ICMPV6,
false,
NXM_NX_ICMPV6_TYPE, "NXM_NX_ICMPV6_TYPE",
- OXM_OF_ICMPV6_TYPE, "OXM_OF_ICMPV6_TYPE",
+ OXM_OF_ICMPV6_TYPE, "OXM_OF_ICMPV6_TYPE", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NONE,
+ -1,
}, {
MFF_ICMPV6_CODE, "icmpv6_code", NULL,
MF_FIELD_SIZES(u8),
MFP_ICMPV6,
false,
NXM_NX_ICMPV6_CODE, "NXM_NX_ICMPV6_CODE",
- OXM_OF_ICMPV6_CODE, "OXM_OF_ICMPV6_CODE",
+ OXM_OF_ICMPV6_CODE, "OXM_OF_ICMPV6_CODE", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NONE,
+ -1,
},
/* ## ---- ## */
MFP_ND,
false,
NXM_NX_ND_TARGET, "NXM_NX_ND_TARGET",
- OXM_OF_IPV6_ND_TARGET, "OXM_OF_IPV6_ND_TARGET",
+ OXM_OF_IPV6_ND_TARGET, "OXM_OF_IPV6_ND_TARGET", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_ND_SLL, "nd_sll", NULL,
MF_FIELD_SIZES(mac),
MFP_ND_SOLICIT,
false,
NXM_NX_ND_SLL, "NXM_NX_ND_SLL",
- OXM_OF_IPV6_ND_SLL, "OXM_OF_IPV6_ND_SLL",
+ OXM_OF_IPV6_ND_SLL, "OXM_OF_IPV6_ND_SLL", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}, {
MFF_ND_TLL, "nd_tll", NULL,
MF_FIELD_SIZES(mac),
MFP_ND_ADVERT,
false,
NXM_NX_ND_TLL, "NXM_NX_ND_TLL",
- OXM_OF_IPV6_ND_TLL, "OXM_OF_IPV6_ND_TLL",
+ OXM_OF_IPV6_ND_TLL, "OXM_OF_IPV6_ND_TLL", OFP12_VERSION,
OFPUTIL_P_NXM_OXM_ANY,
OFPUTIL_P_NXM_OXM_ANY,
+ -1,
}
};
return NULL;
}
+uint32_t
+mf_oxm_header(enum mf_field_id id, enum ofp_version oxm_version)
+{
+ const struct mf_field *field = mf_from_id(id);
+
+ return (oxm_version >= field->oxm_version
+ ? field->oxm_header
+ : field->nxm_header);
+}
+
/* Returns true if 'wc' wildcards all the bits in field 'mf', false if 'wc'
* specifies at least one bit in the field.
*
mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)
{
switch (mf->id) {
+ case MFF_DP_HASH:
+ return !wc->masks.dp_hash;
+ case MFF_RECIRC_ID:
+ return !wc->masks.recirc_id;
case MFF_TUN_SRC:
return !wc->masks.tunnel.ip_src;
case MFF_TUN_DST:
return !(wc->masks.vlan_tci & htons(VLAN_PCP_MASK));
case MFF_MPLS_LABEL:
- return !(wc->masks.mpls_lse & htonl(MPLS_LABEL_MASK));
+ return !(wc->masks.mpls_lse[0] & htonl(MPLS_LABEL_MASK));
case MFF_MPLS_TC:
- return !(wc->masks.mpls_lse & htonl(MPLS_TC_MASK));
+ return !(wc->masks.mpls_lse[1] & htonl(MPLS_TC_MASK));
case MFF_MPLS_BOS:
- return !(wc->masks.mpls_lse & htonl(MPLS_BOS_MASK));
+ return !(wc->masks.mpls_lse[2] & htonl(MPLS_BOS_MASK));
case MFF_IPV4_SRC:
return !wc->masks.nw_src;
case MFF_N_IDS:
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
return true;
}
- NOT_REACHED();
-}
-
-static bool
-is_icmpv4(const struct flow *flow)
-{
- return (flow->dl_type == htons(ETH_TYPE_IP)
- && flow->nw_proto == IPPROTO_ICMP);
-}
-
-static bool
-is_icmpv6(const struct flow *flow)
-{
- return (flow->dl_type == htons(ETH_TYPE_IPV6)
- && flow->nw_proto == IPPROTO_ICMPV6);
+ OVS_NOT_REACHED();
}
/* Returns true if 'flow' meets the prerequisites for 'mf', false otherwise. */
&& (flow->tp_src == htons(ND_NEIGHBOR_ADVERT)));
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
/* Set field and it's prerequisities in the mask.
mf_is_value_valid(const struct mf_field *mf, const union mf_value *value)
{
switch (mf->id) {
+ case MFF_DP_HASH:
+ case MFF_RECIRC_ID:
case MFF_TUN_ID:
case MFF_TUN_SRC:
case MFF_TUN_DST:
case MFF_N_IDS:
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
union mf_value *value)
{
switch (mf->id) {
+ case MFF_DP_HASH:
+ value->be32 = htonl(flow->dp_hash);
+ break;
+ case MFF_RECIRC_ID:
+ value->be32 = htonl(flow->recirc_id);
+ break;
case MFF_TUN_ID:
value->be64 = flow->tunnel.tun_id;
break;
break;
case MFF_MPLS_LABEL:
- value->be32 = htonl(mpls_lse_to_label(flow->mpls_lse));
+ value->be32 = htonl(mpls_lse_to_label(flow->mpls_lse[0]));
break;
case MFF_MPLS_TC:
- value->u8 = mpls_lse_to_tc(flow->mpls_lse);
+ value->u8 = mpls_lse_to_tc(flow->mpls_lse[0]);
break;
case MFF_MPLS_BOS:
- value->u8 = mpls_lse_to_bos(flow->mpls_lse);
+ value->u8 = mpls_lse_to_bos(flow->mpls_lse[0]);
break;
case MFF_IPV4_SRC:
case MFF_N_IDS:
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
const union mf_value *value, struct match *match)
{
switch (mf->id) {
+ case MFF_DP_HASH:
+ match_set_dp_hash(match, ntohl(value->be32));
+ break;
+ case MFF_RECIRC_ID:
+ match_set_recirc_id(match, ntohl(value->be32));
+ break;
case MFF_TUN_ID:
match_set_tun_id(match, value->be64);
break;
break;
case MFF_MPLS_LABEL:
- match_set_mpls_label(match, value->be32);
+ match_set_mpls_label(match, 0, value->be32);
break;
case MFF_MPLS_TC:
- match_set_mpls_tc(match, value->u8);
+ match_set_mpls_tc(match, 0, value->u8);
break;
case MFF_MPLS_BOS:
- match_set_mpls_bos(match, value->u8);
+ match_set_mpls_bos(match, 0, value->u8);
break;
case MFF_IPV4_SRC:
case MFF_N_IDS:
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
const union mf_value *value, struct flow *flow)
{
switch (mf->id) {
+ case MFF_DP_HASH:
+ flow->dp_hash = ntohl(value->be32);
+ break;
+ case MFF_RECIRC_ID:
+ flow->recirc_id = ntohl(value->be32);
+ break;
case MFF_TUN_ID:
flow->tunnel.tun_id = value->be64;
break;
break;
case MFF_MPLS_LABEL:
- flow_set_mpls_label(flow, value->be32);
+ flow_set_mpls_label(flow, 0, value->be32);
break;
case MFF_MPLS_TC:
- flow_set_mpls_tc(flow, value->u8);
+ flow_set_mpls_tc(flow, 0, value->u8);
break;
case MFF_MPLS_BOS:
- flow_set_mpls_bos(flow, value->u8);
+ flow_set_mpls_bos(flow, 0, value->u8);
break;
case MFF_IPV4_SRC:
break;
case MFF_IP_FRAG:
- flow->nw_frag &= value->u8;
+ flow->nw_frag = value->u8 & FLOW_NW_FRAG_MASK;
break;
case MFF_ARP_OP:
case MFF_N_IDS:
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
mf_set_wild(const struct mf_field *mf, struct match *match)
{
switch (mf->id) {
+ case MFF_DP_HASH:
+ match->flow.dp_hash = 0;
+ match->wc.masks.dp_hash = 0;
+ break;
+ case MFF_RECIRC_ID:
+ match->flow.recirc_id = 0;
+ match->wc.masks.recirc_id = 0;
+ break;
case MFF_TUN_ID:
match_set_tun_id_masked(match, htonll(0), htonll(0));
break;
break;
case MFF_MPLS_LABEL:
- match_set_any_mpls_label(match);
+ match_set_any_mpls_label(match, 0);
break;
case MFF_MPLS_TC:
- match_set_any_mpls_tc(match);
+ match_set_any_mpls_tc(match, 0);
break;
case MFF_MPLS_BOS:
- match_set_any_mpls_bos(match);
+ match_set_any_mpls_bos(match, 0);
break;
case MFF_IPV4_SRC:
case MFF_N_IDS:
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
}
switch (mf->id) {
+ case MFF_RECIRC_ID:
case MFF_IN_PORT:
case MFF_IN_PORT_OXM:
case MFF_SKB_PRIORITY:
case MFF_ICMPV6_CODE:
return OFPUTIL_P_NONE;
+ case MFF_DP_HASH:
+ match_set_dp_hash_masked(match, ntohl(value->be32), ntohl(mask->be32));
+ break;
case MFF_TUN_ID:
match_set_tun_id_masked(match, value->be64, mask->be64);
break;
case MFF_N_IDS:
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return mf->usable_protocols_bitwise;
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
if (!error && !mf_is_mask_valid(mf, mask)) {
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
\f