mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 01:51:26 +00:00
ofproto: Add NXM_NX_TUN_GBP_ID and NXM_NX_TUN_GBP_FLAGS
Introduces two new NXMs to represent VXLAN-GBP [0] fields. actions=load:0x10->NXM_NX_TUN_GBP_ID[],NORMAL tun_gbp_id=0x10,actions=drop This enables existing VXLAN tunnels to carry security label information such as a SELinux context to other network peers. The values are carried to/from the datapath using the attribute OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS. [0] https://tools.ietf.org/html/draft-smith-vxlan-group-policy-00 Signed-off-by: Madhu Challa <challa@noironetworks.com> Acked-by: Ben Pfaff <blp@nicira.com> Signed-off-by: Thomas Graf <tgraf@noironetworks.com>
This commit is contained in:
parent
c7ecbf1e9c
commit
ac6073e3cd
1
NEWS
1
NEWS
@ -63,6 +63,7 @@ Post-v2.3.0
|
||||
- The documentation now use the term 'destination' to mean one of syslog,
|
||||
console or file for vlog logging instead of the previously used term
|
||||
'facility'.
|
||||
- Support for VXLAN Group Policy extension
|
||||
|
||||
|
||||
v2.3.0 - 14 Aug 2014
|
||||
|
16
lib/flow.c
16
lib/flow.c
@ -119,7 +119,7 @@ struct mf_ctx {
|
||||
* away. Some GCC versions gave warnings on ALWAYS_INLINE, so these are
|
||||
* defined as macros. */
|
||||
|
||||
#if (FLOW_WC_SEQ != 30)
|
||||
#if (FLOW_WC_SEQ != 31)
|
||||
#define MINIFLOW_ASSERT(X) ovs_assert(X)
|
||||
BUILD_MESSAGE("FLOW_WC_SEQ changed: miniflow_extract() will have runtime "
|
||||
"assertions enabled. Consider updating FLOW_WC_SEQ after "
|
||||
@ -765,13 +765,15 @@ flow_unwildcard_tp_ports(const struct flow *flow, struct flow_wildcards *wc)
|
||||
void
|
||||
flow_get_metadata(const struct flow *flow, struct flow_metadata *fmd)
|
||||
{
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 31);
|
||||
|
||||
fmd->dp_hash = flow->dp_hash;
|
||||
fmd->recirc_id = flow->recirc_id;
|
||||
fmd->tun_id = flow->tunnel.tun_id;
|
||||
fmd->tun_src = flow->tunnel.ip_src;
|
||||
fmd->tun_dst = flow->tunnel.ip_dst;
|
||||
fmd->gbp_id = flow->tunnel.gbp_id;
|
||||
fmd->gbp_flags = flow->tunnel.gbp_flags;
|
||||
fmd->metadata = flow->metadata;
|
||||
memcpy(fmd->regs, flow->regs, sizeof fmd->regs);
|
||||
fmd->pkt_mark = flow->pkt_mark;
|
||||
@ -912,7 +914,7 @@ void flow_wildcards_init_for_packet(struct flow_wildcards *wc,
|
||||
memset(&wc->masks, 0x0, sizeof wc->masks);
|
||||
|
||||
/* Update this function whenever struct flow changes. */
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 31);
|
||||
|
||||
if (flow->tunnel.ip_dst) {
|
||||
if (flow->tunnel.flags & FLOW_TNL_F_KEY) {
|
||||
@ -925,6 +927,8 @@ void flow_wildcards_init_for_packet(struct flow_wildcards *wc,
|
||||
WC_MASK_FIELD(wc, tunnel.ip_ttl);
|
||||
WC_MASK_FIELD(wc, tunnel.tp_src);
|
||||
WC_MASK_FIELD(wc, tunnel.tp_dst);
|
||||
WC_MASK_FIELD(wc, tunnel.gbp_id);
|
||||
WC_MASK_FIELD(wc, tunnel.gbp_flags);
|
||||
} else if (flow->tunnel.tun_id) {
|
||||
WC_MASK_FIELD(wc, tunnel.tun_id);
|
||||
}
|
||||
@ -1009,7 +1013,7 @@ uint64_t
|
||||
flow_wc_map(const struct flow *flow)
|
||||
{
|
||||
/* Update this function whenever struct flow changes. */
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 31);
|
||||
|
||||
uint64_t map = (flow->tunnel.ip_dst) ? MINIFLOW_MAP(tunnel) : 0;
|
||||
|
||||
@ -1061,7 +1065,7 @@ void
|
||||
flow_wildcards_clear_non_packet_fields(struct flow_wildcards *wc)
|
||||
{
|
||||
/* Update this function whenever struct flow changes. */
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 31);
|
||||
|
||||
memset(&wc->masks.metadata, 0, sizeof wc->masks.metadata);
|
||||
memset(&wc->masks.regs, 0, sizeof wc->masks.regs);
|
||||
@ -1620,7 +1624,7 @@ flow_push_mpls(struct flow *flow, int n, ovs_be16 mpls_eth_type,
|
||||
flow->mpls_lse[0] = set_mpls_lse_values(ttl, tc, 1, htonl(label));
|
||||
|
||||
/* Clear all L3 and L4 fields and dp_hash. */
|
||||
BUILD_ASSERT(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT(FLOW_WC_SEQ == 31);
|
||||
memset((char *) flow + FLOW_SEGMENT_2_ENDS_AT, 0,
|
||||
sizeof(struct flow) - FLOW_SEGMENT_2_ENDS_AT);
|
||||
flow->dp_hash = 0;
|
||||
|
@ -38,7 +38,7 @@ struct pkt_metadata;
|
||||
/* This sequence number should be incremented whenever anything involving flows
|
||||
* or the wildcarding of flows changes. This will cause build assertion
|
||||
* failures in places which likely need to be updated. */
|
||||
#define FLOW_WC_SEQ 30
|
||||
#define FLOW_WC_SEQ 31
|
||||
|
||||
/* Number of Open vSwitch extension 32-bit registers. */
|
||||
#define FLOW_N_REGS 8
|
||||
@ -156,7 +156,7 @@ BUILD_ASSERT_DECL(sizeof(struct flow) % sizeof(uint64_t) == 0);
|
||||
/* Remember to update FLOW_WC_SEQ when changing 'struct flow'. */
|
||||
BUILD_ASSERT_DECL(offsetof(struct flow, igmp_group_ip4) + sizeof(uint32_t)
|
||||
== sizeof(struct flow_tnl) + 192
|
||||
&& FLOW_WC_SEQ == 30);
|
||||
&& FLOW_WC_SEQ == 31);
|
||||
|
||||
/* Incremental points at which flow classification may be performed in
|
||||
* segments.
|
||||
@ -186,6 +186,8 @@ struct flow_metadata {
|
||||
ovs_be64 tun_id; /* Encapsulating tunnel ID. */
|
||||
ovs_be32 tun_src; /* Tunnel outer IPv4 src addr */
|
||||
ovs_be32 tun_dst; /* Tunnel outer IPv4 dst addr */
|
||||
ovs_be16 gbp_id; /* Group policy ID */
|
||||
uint8_t gbp_flags; /* Group policy flags */
|
||||
ovs_be64 metadata; /* OpenFlow 1.1+ metadata field. */
|
||||
uint32_t regs[FLOW_N_REGS]; /* Registers. */
|
||||
uint32_t pkt_mark; /* Packet mark. */
|
||||
|
37
lib/match.c
37
lib/match.c
@ -224,6 +224,32 @@ match_set_tun_flags_masked(struct match *match, uint16_t flags, uint16_t mask)
|
||||
match->flow.tunnel.flags = flags & mask;
|
||||
}
|
||||
|
||||
void
|
||||
match_set_tun_gbp_id_masked(struct match *match, ovs_be16 gbp_id, ovs_be16 mask)
|
||||
{
|
||||
match->wc.masks.tunnel.gbp_id = mask;
|
||||
match->flow.tunnel.gbp_id = gbp_id & mask;
|
||||
}
|
||||
|
||||
void
|
||||
match_set_tun_gbp_id(struct match *match, ovs_be16 gbp_id)
|
||||
{
|
||||
match_set_tun_gbp_id_masked(match, gbp_id, OVS_BE16_MAX);
|
||||
}
|
||||
|
||||
void
|
||||
match_set_tun_gbp_flags_masked(struct match *match, uint8_t flags, uint8_t mask)
|
||||
{
|
||||
match->wc.masks.tunnel.gbp_flags = mask;
|
||||
match->flow.tunnel.gbp_flags = flags & mask;
|
||||
}
|
||||
|
||||
void
|
||||
match_set_tun_gbp_flags(struct match *match, uint8_t flags)
|
||||
{
|
||||
match_set_tun_gbp_flags_masked(match, flags, UINT8_MAX);
|
||||
}
|
||||
|
||||
void
|
||||
match_set_in_port(struct match *match, ofp_port_t ofp_port)
|
||||
{
|
||||
@ -852,6 +878,15 @@ format_flow_tunnel(struct ds *s, const struct match *match)
|
||||
format_ip_netmask(s, "tun_src", tnl->ip_src, wc->masks.tunnel.ip_src);
|
||||
format_ip_netmask(s, "tun_dst", tnl->ip_dst, wc->masks.tunnel.ip_dst);
|
||||
|
||||
if (wc->masks.tunnel.gbp_id) {
|
||||
format_be16_masked(s, "tun_gbp_id", tnl->gbp_id,
|
||||
wc->masks.tunnel.gbp_id);
|
||||
}
|
||||
|
||||
if (wc->masks.tunnel.gbp_flags) {
|
||||
ds_put_format(s, "tun_gbp_flags=%#"PRIx8",", tnl->gbp_flags);
|
||||
}
|
||||
|
||||
if (wc->masks.tunnel.ip_tos) {
|
||||
ds_put_format(s, "tun_tos=%"PRIx8",", tnl->ip_tos);
|
||||
}
|
||||
@ -877,7 +912,7 @@ match_format(const struct match *match, struct ds *s, int priority)
|
||||
|
||||
int i;
|
||||
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 31);
|
||||
|
||||
if (priority != OFP_DEFAULT_PRIORITY) {
|
||||
ds_put_format(s, "priority=%d,", priority);
|
||||
|
@ -71,6 +71,10 @@ void match_set_tun_tos(struct match *match, uint8_t tos);
|
||||
void match_set_tun_tos_masked(struct match *match, uint8_t tos, uint8_t mask);
|
||||
void match_set_tun_flags(struct match *match, uint16_t flags);
|
||||
void match_set_tun_flags_masked(struct match *match, uint16_t flags, uint16_t mask);
|
||||
void match_set_tun_gbp_id_masked(struct match *match, ovs_be16 gbp_id, ovs_be16 mask);
|
||||
void match_set_tun_gbp_id(struct match *match, ovs_be16 gbp_id);
|
||||
void match_set_tun_gbp_flags_masked(struct match *match, uint8_t flags, uint8_t mask);
|
||||
void match_set_tun_gbp_flags(struct match *match, uint8_t flags);
|
||||
void match_set_in_port(struct match *, ofp_port_t ofp_port);
|
||||
void match_set_pkt_mark(struct match *, uint32_t pkt_mark);
|
||||
void match_set_pkt_mark_masked(struct match *, uint32_t pkt_mark, uint32_t mask);
|
||||
|
@ -119,6 +119,10 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)
|
||||
case MFF_TUN_TTL:
|
||||
case MFF_TUN_FLAGS:
|
||||
return !wc->masks.tunnel.tun_id;
|
||||
case MFF_TUN_GBP_ID:
|
||||
return !wc->masks.tunnel.gbp_id;
|
||||
case MFF_TUN_GBP_FLAGS:
|
||||
return !wc->masks.tunnel.gbp_flags;
|
||||
case MFF_METADATA:
|
||||
return !wc->masks.metadata;
|
||||
case MFF_IN_PORT:
|
||||
@ -372,6 +376,8 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value)
|
||||
case MFF_TUN_TOS:
|
||||
case MFF_TUN_TTL:
|
||||
case MFF_TUN_FLAGS:
|
||||
case MFF_TUN_GBP_ID:
|
||||
case MFF_TUN_GBP_FLAGS:
|
||||
case MFF_METADATA:
|
||||
case MFF_IN_PORT:
|
||||
case MFF_SKB_PRIORITY:
|
||||
@ -482,6 +488,12 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow,
|
||||
case MFF_TUN_FLAGS:
|
||||
value->be16 = htons(flow->tunnel.flags);
|
||||
break;
|
||||
case MFF_TUN_GBP_ID:
|
||||
value->be16 = flow->tunnel.gbp_id;
|
||||
break;
|
||||
case MFF_TUN_GBP_FLAGS:
|
||||
value->u8 = flow->tunnel.gbp_flags;
|
||||
break;
|
||||
case MFF_TUN_TTL:
|
||||
value->u8 = flow->tunnel.ip_ttl;
|
||||
break;
|
||||
@ -690,6 +702,12 @@ mf_set_value(const struct mf_field *mf,
|
||||
case MFF_TUN_FLAGS:
|
||||
match_set_tun_flags(match, ntohs(value->be16));
|
||||
break;
|
||||
case MFF_TUN_GBP_ID:
|
||||
match_set_tun_gbp_id(match, value->be16);
|
||||
break;
|
||||
case MFF_TUN_GBP_FLAGS:
|
||||
match_set_tun_gbp_flags(match, value->u8);
|
||||
break;
|
||||
case MFF_TUN_TOS:
|
||||
match_set_tun_tos(match, value->u8);
|
||||
break;
|
||||
@ -922,6 +940,12 @@ mf_set_flow_value(const struct mf_field *mf,
|
||||
case MFF_TUN_FLAGS:
|
||||
flow->tunnel.flags = ntohs(value->be16);
|
||||
break;
|
||||
case MFF_TUN_GBP_ID:
|
||||
flow->tunnel.gbp_id = value->be16;
|
||||
break;
|
||||
case MFF_TUN_GBP_FLAGS:
|
||||
flow->tunnel.gbp_flags = value->u8;
|
||||
break;
|
||||
case MFF_TUN_TOS:
|
||||
flow->tunnel.ip_tos = value->u8;
|
||||
break;
|
||||
@ -1180,6 +1204,12 @@ mf_set_wild(const struct mf_field *mf, struct match *match)
|
||||
case MFF_TUN_FLAGS:
|
||||
match_set_tun_flags_masked(match, 0, 0);
|
||||
break;
|
||||
case MFF_TUN_GBP_ID:
|
||||
match_set_tun_gbp_id_masked(match, 0, 0);
|
||||
break;
|
||||
case MFF_TUN_GBP_FLAGS:
|
||||
match_set_tun_gbp_flags_masked(match, 0, 0);
|
||||
break;
|
||||
case MFF_TUN_TOS:
|
||||
match_set_tun_tos_masked(match, 0, 0);
|
||||
break;
|
||||
@ -1428,6 +1458,12 @@ mf_set(const struct mf_field *mf,
|
||||
case MFF_TUN_FLAGS:
|
||||
match_set_tun_flags_masked(match, ntohs(value->be16), ntohs(mask->be16));
|
||||
break;
|
||||
case MFF_TUN_GBP_ID:
|
||||
match_set_tun_gbp_id_masked(match, value->be16, mask->be16);
|
||||
break;
|
||||
case MFF_TUN_GBP_FLAGS:
|
||||
match_set_tun_gbp_flags_masked(match, value->u8, mask->u8);
|
||||
break;
|
||||
case MFF_TUN_TTL:
|
||||
match_set_tun_ttl_masked(match, value->u8, mask->u8);
|
||||
break;
|
||||
|
@ -415,6 +415,34 @@ enum OVS_PACKED_ENUM mf_field_id {
|
||||
*/
|
||||
MFF_TUN_TOS,
|
||||
|
||||
/* "tun_gbp_id".
|
||||
*
|
||||
* VXLAN Group Policy ID
|
||||
*
|
||||
* Type: be16.
|
||||
* Maskable: bitwise.
|
||||
* Formatting: decimal.
|
||||
* Prerequisites: none.
|
||||
* Access: read/write.
|
||||
* NXM: NXM_NX_TUN_GBP_ID(38) since v2.4.
|
||||
* OXM: none.
|
||||
*/
|
||||
MFF_TUN_GBP_ID,
|
||||
|
||||
/* "tun_gbp_flags".
|
||||
*
|
||||
* VXLAN Group Policy flags
|
||||
*
|
||||
* Type: u8.
|
||||
* Maskable: bitwise.
|
||||
* Formatting: hexadecimal.
|
||||
* Prerequisites: none.
|
||||
* Access: read/write.
|
||||
* NXM: NXM_NX_TUN_GBP_FLAGS(39) since v2.4.
|
||||
* OXM: none.
|
||||
*/
|
||||
MFF_TUN_GBP_FLAGS,
|
||||
|
||||
/* "metadata".
|
||||
*
|
||||
* A scratch pad value standardized in OpenFlow 1.1+. Initially zero, at
|
||||
|
@ -817,7 +817,7 @@ nx_put_raw(struct ofpbuf *b, enum ofp_version oxm, const struct match *match,
|
||||
int match_len;
|
||||
int i;
|
||||
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 31);
|
||||
|
||||
/* Metadata. */
|
||||
if (match->wc.masks.dp_hash) {
|
||||
@ -926,6 +926,10 @@ nx_put_raw(struct ofpbuf *b, enum ofp_version oxm, const struct match *match,
|
||||
flow->tunnel.ip_src, match->wc.masks.tunnel.ip_src);
|
||||
nxm_put_32m(b, MFF_TUN_DST, oxm,
|
||||
flow->tunnel.ip_dst, match->wc.masks.tunnel.ip_dst);
|
||||
nxm_put_16m(b, MFF_TUN_GBP_ID, oxm,
|
||||
flow->tunnel.gbp_id, match->wc.masks.tunnel.gbp_id);
|
||||
nxm_put_8m(b, MFF_TUN_GBP_FLAGS, oxm,
|
||||
flow->tunnel.gbp_flags, match->wc.masks.tunnel.gbp_flags);
|
||||
|
||||
/* Registers. */
|
||||
if (oxm < OFP15_VERSION) {
|
||||
|
@ -1264,6 +1264,7 @@ tunnel_key_attr_len(int type)
|
||||
case OVS_TUNNEL_KEY_ATTR_TP_DST: return 2;
|
||||
case OVS_TUNNEL_KEY_ATTR_OAM: return 0;
|
||||
case OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS: return -2;
|
||||
case OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS: return -2;
|
||||
case __OVS_TUNNEL_KEY_ATTR_MAX:
|
||||
return -1;
|
||||
}
|
||||
@ -1353,6 +1354,25 @@ odp_tun_key_from_attr(const struct nlattr *attr, struct flow_tnl *tun)
|
||||
case OVS_TUNNEL_KEY_ATTR_OAM:
|
||||
tun->flags |= FLOW_TNL_F_OAM;
|
||||
break;
|
||||
case OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS: {
|
||||
static const struct nl_policy vxlan_opts_policy[] = {
|
||||
[OVS_VXLAN_EXT_GBP] = { .type = NL_A_U32 },
|
||||
};
|
||||
struct nlattr *ext[ARRAY_SIZE(vxlan_opts_policy)];
|
||||
|
||||
if (!nl_parse_nested(a, vxlan_opts_policy, ext, ARRAY_SIZE(ext))) {
|
||||
return ODP_FIT_ERROR;
|
||||
}
|
||||
|
||||
if (ext[OVS_VXLAN_EXT_GBP]) {
|
||||
uint32_t gbp = nl_attr_get_u32(ext[OVS_VXLAN_EXT_GBP]);
|
||||
|
||||
tun->gbp_id = htons(gbp & 0xFFFF);
|
||||
tun->gbp_flags = (gbp >> 16) & 0xFF;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS: {
|
||||
if (parse_geneve_opts(a)) {
|
||||
return ODP_FIT_ERROR;
|
||||
@ -1415,6 +1435,14 @@ tun_key_to_attr(struct ofpbuf *a, const struct flow_tnl *tun_key)
|
||||
if (tun_key->flags & FLOW_TNL_F_OAM) {
|
||||
nl_msg_put_flag(a, OVS_TUNNEL_KEY_ATTR_OAM);
|
||||
}
|
||||
if (tun_key->gbp_flags || tun_key->gbp_id) {
|
||||
size_t vxlan_opts_ofs;
|
||||
|
||||
vxlan_opts_ofs = nl_msg_start_nested(a, OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS);
|
||||
nl_msg_put_u32(a, OVS_VXLAN_EXT_GBP,
|
||||
(tun_key->gbp_flags << 16) | ntohs(tun_key->gbp_id));
|
||||
nl_msg_end_nested(a, vxlan_opts_ofs);
|
||||
}
|
||||
|
||||
nl_msg_end_nested(a, tun_key_ofs);
|
||||
}
|
||||
@ -1454,7 +1482,9 @@ odp_mask_is_exact(enum ovs_key_attr attr, const void *mask, size_t size)
|
||||
&& tun_mask->ip_tos == UINT8_MAX
|
||||
&& tun_mask->ip_ttl == UINT8_MAX
|
||||
&& tun_mask->tp_src == OVS_BE16_MAX
|
||||
&& tun_mask->tp_dst == OVS_BE16_MAX;
|
||||
&& tun_mask->tp_dst == OVS_BE16_MAX
|
||||
&& tun_mask->gbp_id == OVS_BE16_MAX
|
||||
&& tun_mask->gbp_flags == UINT8_MAX;
|
||||
}
|
||||
|
||||
if (attr == OVS_KEY_ATTR_ARP) {
|
||||
@ -1799,6 +1829,8 @@ format_odp_key_attr(const struct nlattr *a, const struct nlattr *ma,
|
||||
format_u8u(ds, "ttl", key.ip_ttl, MASK(mask, ip_ttl), verbose);
|
||||
format_be16(ds, "tp_src", key.tp_src, MASK(mask, tp_src), verbose);
|
||||
format_be16(ds, "tp_dst", key.tp_dst, MASK(mask, tp_dst), verbose);
|
||||
format_be16(ds, "gbp_id", key.gbp_id, MASK(mask, gbp_id), verbose);
|
||||
format_u8x(ds, "gbp_flags", key.gbp_flags, MASK(mask, gbp_flags), verbose);
|
||||
format_tun_flags(ds, "flags", key.flags, MASK(mask, flags), verbose);
|
||||
ds_chomp(ds, ',');
|
||||
break;
|
||||
@ -2652,6 +2684,8 @@ parse_odp_key_mask_attr(const char *s, const struct simap *port_names,
|
||||
SCAN_FIELD("ttl=", u8, ip_ttl);
|
||||
SCAN_FIELD("tp_src=", be16, tp_src);
|
||||
SCAN_FIELD("tp_dst=", be16, tp_dst);
|
||||
SCAN_FIELD("gbp_id=", be16, gbp_id);
|
||||
SCAN_FIELD("gbp_flags=", u8, gbp_flags);
|
||||
SCAN_FIELD("flags(", tun_flags, flags);
|
||||
} SCAN_END(OVS_KEY_ATTR_TUNNEL);
|
||||
|
||||
|
@ -114,6 +114,7 @@ void odp_portno_names_destroy(struct hmap *portno_names);
|
||||
* - OVS_TUNNEL_KEY_ATTR_CSUM 0 -- 4 4
|
||||
* - OVS_TUNNEL_KEY_ATTR_OAM 0 -- 4 4
|
||||
* - OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS 256 -- 4 260
|
||||
* - OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS - -- - - (shared with _GENEVE_OPTS)
|
||||
* OVS_KEY_ATTR_IN_PORT 4 -- 4 8
|
||||
* OVS_KEY_ATTR_SKB_MARK 4 -- 4 8
|
||||
* OVS_KEY_ATTR_DP_HASH 4 -- 4 8
|
||||
@ -133,7 +134,7 @@ void odp_portno_names_destroy(struct hmap *portno_names);
|
||||
* add another field and forget to adjust this value.
|
||||
*/
|
||||
#define ODPUTIL_FLOW_KEY_BYTES 512
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 31);
|
||||
|
||||
/* A buffer with sufficient size and alignment to hold an nlattr-formatted flow
|
||||
* key. An array of "struct nlattr" might not, in theory, be sufficiently
|
||||
|
@ -135,6 +135,15 @@ ofp_print_packet_in(struct ds *string, const struct ofp_header *oh,
|
||||
ds_put_format(string, " tun_dst="IP_FMT, IP_ARGS(pin.fmd.tun_dst));
|
||||
}
|
||||
|
||||
if (pin.fmd.gbp_id != htons(0)) {
|
||||
ds_put_format(string, " gbp_id=%"PRIu16,
|
||||
ntohs(pin.fmd.gbp_id));
|
||||
}
|
||||
|
||||
if (pin.fmd.gbp_flags) {
|
||||
ds_put_format(string, " gbp_flags=0x%02"PRIx8, pin.fmd.gbp_flags);
|
||||
}
|
||||
|
||||
if (pin.fmd.metadata != htonll(0)) {
|
||||
ds_put_format(string, " metadata=0x%"PRIx64, ntohll(pin.fmd.metadata));
|
||||
}
|
||||
|
@ -186,7 +186,7 @@ ofputil_netmask_to_wcbits(ovs_be32 netmask)
|
||||
void
|
||||
ofputil_wildcard_from_ofpfw10(uint32_t ofpfw, struct flow_wildcards *wc)
|
||||
{
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 31);
|
||||
|
||||
/* Initialize most of wc. */
|
||||
flow_wildcards_init_catchall(wc);
|
||||
@ -3298,6 +3298,8 @@ ofputil_decode_packet_in_finish(struct ofputil_packet_in *pin,
|
||||
pin->fmd.tun_id = match->flow.tunnel.tun_id;
|
||||
pin->fmd.tun_src = match->flow.tunnel.ip_src;
|
||||
pin->fmd.tun_dst = match->flow.tunnel.ip_dst;
|
||||
pin->fmd.gbp_id = match->flow.tunnel.gbp_id;
|
||||
pin->fmd.gbp_flags = match->flow.tunnel.gbp_flags;
|
||||
pin->fmd.metadata = match->flow.metadata;
|
||||
memcpy(pin->fmd.regs, match->flow.regs, sizeof pin->fmd.regs);
|
||||
pin->fmd.pkt_mark = match->flow.pkt_mark;
|
||||
@ -3423,6 +3425,12 @@ ofputil_packet_in_to_match(const struct ofputil_packet_in *pin,
|
||||
if (pin->fmd.tun_dst != htonl(0)) {
|
||||
match_set_tun_dst(match, pin->fmd.tun_dst);
|
||||
}
|
||||
if (pin->fmd.gbp_id != htons(0)) {
|
||||
match_set_tun_gbp_id(match, pin->fmd.gbp_id);
|
||||
}
|
||||
if (pin->fmd.gbp_flags) {
|
||||
match_set_tun_gbp_flags(match, pin->fmd.gbp_flags);
|
||||
}
|
||||
if (pin->fmd.metadata != htonll(0)) {
|
||||
match_set_metadata(match, pin->fmd.metadata);
|
||||
}
|
||||
|
@ -41,6 +41,9 @@ struct flow_tnl {
|
||||
uint8_t ip_ttl;
|
||||
ovs_be16 tp_src;
|
||||
ovs_be16 tp_dst;
|
||||
ovs_be16 gbp_id;
|
||||
uint8_t gbp_flags;
|
||||
uint8_t pad1[5]; /* Pad to 64 bits. */
|
||||
};
|
||||
|
||||
/* Unfortunately, a "struct flow" sometimes has to handle OpenFlow port
|
||||
|
@ -2670,7 +2670,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
|
||||
|
||||
/* If 'struct flow' gets additional metadata, we'll need to zero it out
|
||||
* before traversing a patch port. */
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 30);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 31);
|
||||
memset(&flow_tnl, 0, sizeof flow_tnl);
|
||||
|
||||
if (!xport) {
|
||||
|
16
tests/odp.at
16
tests/odp.at
@ -39,7 +39,7 @@ s/^/skb_priority(0),skb_mark(0),recirc_id(0),dp_hash(0),/
|
||||
|
||||
echo
|
||||
echo '# Valid forms with tunnel header.'
|
||||
sed 's/^/skb_priority(0),tunnel(tun_id=0x7f10354,src=10.10.10.10,dst=20.20.20.20,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(csum,key)),skb_mark(0x1234),recirc_id(0),dp_hash(0),/' odp-base.txt
|
||||
sed 's/^/skb_priority(0),tunnel(tun_id=0x7f10354,src=10.10.10.10,dst=20.20.20.20,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(csum,key)),skb_mark(0x1234),recirc_id(0),dp_hash(0),/' odp-base.txt
|
||||
|
||||
echo
|
||||
echo '# Valid forms with VLAN header.'
|
||||
@ -59,13 +59,13 @@ s/\(eth([[^)]]*),?\)/\1,eth_type(0x8848),mpls(label=100,tc=7,ttl=64,bos=1)/' odp
|
||||
|
||||
echo
|
||||
echo '# Valid forms with tunnel and VLAN headers.'
|
||||
sed 's/^/skb_priority(0),tunnel(tun_id=0xfedcba9876543210,src=10.0.0.1,dst=10.0.0.2,tos=0x8,ttl=128,tp_src=0,tp_dst=0,flags(key)),skb_mark(0),recirc_id(0),dp_hash(0),/
|
||||
sed 's/^/skb_priority(0),tunnel(tun_id=0xfedcba9876543210,src=10.0.0.1,dst=10.0.0.2,tos=0x8,ttl=128,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),skb_mark(0),recirc_id(0),dp_hash(0),/
|
||||
s/\(eth([[^)]]*)\),*/\1,eth_type(0x8100),vlan(vid=99,pcp=7),encap(/
|
||||
s/$/)/' odp-base.txt
|
||||
|
||||
echo
|
||||
echo '# Valid forms with QOS priority, tunnel, and VLAN headers.'
|
||||
sed 's/^/skb_priority(0x1234),tunnel(tun_id=0xfedcba9876543210,src=10.10.10.10,dst=20.20.20.20,tos=0x8,ttl=64,tp_src=0,tp_dst=0,flags(key)),skb_mark(0),recirc_id(0),dp_hash(0),/
|
||||
sed 's/^/skb_priority(0x1234),tunnel(tun_id=0xfedcba9876543210,src=10.10.10.10,dst=20.20.20.20,tos=0x8,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),skb_mark(0),recirc_id(0),dp_hash(0),/
|
||||
s/\(eth([[^)]]*)\),*/\1,eth_type(0x8100),vlan(vid=99,pcp=7),encap(/
|
||||
s/$/)/' odp-base.txt
|
||||
|
||||
@ -117,7 +117,7 @@ skb_mark(0x1234/0xfff0),in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:
|
||||
|
||||
echo
|
||||
echo '# Valid forms with tunnel header.'
|
||||
sed 's/^/tunnel(tun_id=0x7f10354\/0xff,src=10.10.10.10\/255.255.255.0,dst=20.20.20.20\/255.255.255.0,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(csum,key)),/' odp-base.txt
|
||||
sed 's/^/tunnel(tun_id=0x7f10354\/0xff,src=10.10.10.10\/255.255.255.0,dst=20.20.20.20\/255.255.255.0,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(csum,key)),/' odp-base.txt
|
||||
|
||||
echo
|
||||
echo '# Valid forms with VLAN header.'
|
||||
@ -134,13 +134,13 @@ s/$/)/' odp-base.txt
|
||||
|
||||
echo
|
||||
echo '# Valid forms with tunnel and VLAN headers.'
|
||||
sed 's/^/tunnel(tun_id=0xfedcba9876543210,src=10.0.0.1,dst=10.0.0.2,tos=0x8,ttl=128,tp_src=0,tp_dst=0,flags(key)),/
|
||||
sed 's/^/tunnel(tun_id=0xfedcba9876543210,src=10.0.0.1,dst=10.0.0.2,tos=0x8,ttl=128,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),/
|
||||
s/\(eth([[^)]]*)\),*/\1,eth_type(0x8100),vlan(vid=99/0xff0,pcp=7/0xe),encap(/
|
||||
s/$/)/' odp-base.txt
|
||||
|
||||
echo
|
||||
echo '# Valid forms with QOS priority, tunnel, and VLAN headers.'
|
||||
sed 's/^/skb_priority(0x1234),tunnel(tun_id=0xfedcba9876543210,src=10.10.10.10,dst=20.20.20.20,tos=0x8,ttl=64,tp_src=0,tp_dst=0,flags(key)),/
|
||||
sed 's/^/skb_priority(0x1234),tunnel(tun_id=0xfedcba9876543210,src=10.10.10.10,dst=20.20.20.20,tos=0x8,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),/
|
||||
s/\(eth([[^)]]*)\),*/\1,eth_type(0x8100),vlan(vid=99,pcp=7),encap(/
|
||||
s/$/)/' odp-base.txt
|
||||
|
||||
@ -276,8 +276,8 @@ push_vlan(tpid=0x9100,vid=13,pcp=5)
|
||||
push_vlan(tpid=0x9100,vid=13,pcp=5,cfi=0)
|
||||
pop_vlan
|
||||
sample(sample=9.7%,actions(1,2,3,push_vlan(vid=1,pcp=2)))
|
||||
set(tunnel(tun_id=0xabcdef1234567890,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,csum,key)))
|
||||
set(tunnel(tun_id=0xabcdef1234567890,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(key)))
|
||||
set(tunnel(tun_id=0xabcdef1234567890,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,csum,key)))
|
||||
set(tunnel(tun_id=0xabcdef1234567890,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)))
|
||||
tnl_pop(4)
|
||||
tnl_push(tnl_port(4),header(size=42,type=3,eth(dst=f8:bc:12:44:34:b6,src=f8:bc:12:46:58:e0,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.92,proto=47,tos=0,ttl=64,frag=0x40),gre((flags=0x20,proto=0x6558),key=0x1e241)),out_port(1))
|
||||
tnl_push(tnl_port(4),header(size=46,type=3,eth(dst=f8:bc:12:44:34:b6,src=f8:bc:12:46:58:e0,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.92,proto=47,tos=0,ttl=64,frag=0x40),gre((flags=0xa0,proto=0x6558),csum=0x0,key=0x1e241)),out_port(1))
|
||||
|
@ -1480,7 +1480,7 @@ OVS_VSWITCHD_START
|
||||
instructions: meter,apply_actions,clear_actions,write_actions,write_metadata$goto
|
||||
Write-Actions and Apply-Actions features:
|
||||
actions: output group set_field strip_vlan push_vlan mod_nw_ttl dec_ttl set_mpls_ttl dec_mpls_ttl push_mpls pop_mpls set_queue
|
||||
supported on Set-Field: tun_id tun_src tun_dst metadata in_port in_port_oxm pkt_mark reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 xreg0 xreg1 xreg2 xreg3 eth_src eth_dst vlan_tci vlan_vid vlan_pcp mpls_label mpls_tc ip_src ip_dst ipv6_src ipv6_dst ipv6_label nw_tos ip_dscp nw_ecn nw_ttl arp_op arp_spa arp_tpa arp_sha arp_tha tcp_src tcp_dst udp_src udp_dst sctp_src sctp_dst nd_target nd_sll nd_tll
|
||||
supported on Set-Field: tun_id tun_src tun_dst tun_gbp_id tun_gbp_flags metadata in_port in_port_oxm pkt_mark reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 xreg0 xreg1 xreg2 xreg3 eth_src eth_dst vlan_tci vlan_vid vlan_pcp mpls_label mpls_tc ip_src ip_dst ipv6_src ipv6_dst ipv6_label nw_tos ip_dscp nw_ecn nw_ttl arp_op arp_spa arp_tpa arp_sha arp_tha tcp_src tcp_dst udp_src udp_dst sctp_src sctp_dst nd_target nd_sll nd_tll
|
||||
matching:
|
||||
dp_hash: arbitrary mask
|
||||
recirc_id: exact match or wildcard
|
||||
@ -1488,6 +1488,8 @@ OVS_VSWITCHD_START
|
||||
tun_id: arbitrary mask
|
||||
tun_src: arbitrary mask
|
||||
tun_dst: arbitrary mask
|
||||
tun_gbp_id: arbitrary mask
|
||||
tun_gbp_flags: arbitrary mask
|
||||
metadata: arbitrary mask
|
||||
in_port: exact match or wildcard
|
||||
in_port_oxm: exact match or wildcard
|
||||
@ -1562,7 +1564,7 @@ AT_CHECK(
|
||||
# Check that the configuration was updated.
|
||||
mv expout orig-expout
|
||||
sed 's/classifier/main/
|
||||
75s/1000000/1024/' < orig-expout > expout
|
||||
77s/1000000/1024/' < orig-expout > expout
|
||||
AT_CHECK([ovs-ofctl -O OpenFlow13 dump-table-features br0 | sed '/^$/d
|
||||
/^OFPST_TABLE_FEATURES/d'], [0], [expout])
|
||||
OVS_VSWITCHD_STOP
|
||||
|
@ -13,6 +13,10 @@ for test_case in \
|
||||
'tun_flags=1/1 none' \
|
||||
'tun_tos=0 none' \
|
||||
'tun_ttl=0 none' \
|
||||
'tun_gbp_id=0 NXM,OXM' \
|
||||
'tun_gbp_id=0/0x1 NXM,OXM' \
|
||||
'tun_gbp_flags=0 NXM,OXM' \
|
||||
'tun_gbp_flags=0/0x1 NXM,OXM' \
|
||||
'metadata=0 NXM,OXM,OpenFlow11' \
|
||||
'metadata=1/1 NXM,OXM,OpenFlow11' \
|
||||
'in_port=1 any' \
|
||||
|
@ -23,15 +23,15 @@ AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
||||
])
|
||||
|
||||
dnl remote_ip
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=1.2.3.4,tos=0,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=1.2.3.4,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df))),1
|
||||
])
|
||||
|
||||
dnl local_ip, remote_ip
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=2.2.2.2,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=2.2.2.2,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df))),1
|
||||
])
|
||||
|
||||
dnl reconfigure, local_ip, remote_ip
|
||||
@ -44,17 +44,17 @@ AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
||||
p2 2/1: (gre: csum=true, df_default=false, local_ip=2.2.2.3, remote_ip=1.1.1.1, ttl=1)
|
||||
p3 3/64: (gre64: remote_ip=2.2.2.2)
|
||||
])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df))),1
|
||||
])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.3,tos=0,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.3,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=2.2.2.3,dst=1.1.1.1,tos=0,ttl=1,tp_src=0,tp_dst=0,flags(csum))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=2.2.2.3,dst=1.1.1.1,tos=0,ttl=1,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(csum))),1
|
||||
])
|
||||
|
||||
dnl nonexistent tunnel
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=5.5.5.5,dst=6.6.6.6,tos=0,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [2], [ignore], [dnl
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=5.5.5.5,dst=6.6.6.6,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [2], [ignore], [dnl
|
||||
Invalid datapath flow
|
||||
ovs-appctl: ovs-vswitchd: server returned an error
|
||||
])
|
||||
@ -80,28 +80,28 @@ AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
||||
])
|
||||
|
||||
dnl Tunnel CE and encapsulated packet CE
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=3,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=3,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -2 stdout], [0],
|
||||
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=2.2.2.2,tun_tos=3,tun_ttl=64,,in_port=1,nw_ecn=3,nw_frag=no
|
||||
Datapath actions: 2
|
||||
])
|
||||
|
||||
dnl Tunnel CE and encapsulated packet ECT(1)
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=1,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=1,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -2 stdout], [0],
|
||||
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=2.2.2.2,tun_tos=3,tun_ttl=64,,in_port=1,nw_ecn=1,nw_frag=no
|
||||
Datapath actions: set(ipv4(tos=0x3/0x3)),2
|
||||
])
|
||||
|
||||
dnl Tunnel CE and encapsulated packet ECT(2)
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=2,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=2,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -2 stdout], [0],
|
||||
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=2.2.2.2,tun_tos=3,tun_ttl=64,,in_port=1,nw_ecn=2,nw_frag=no
|
||||
Datapath actions: set(ipv4(tos=0x3/0x3)),2
|
||||
])
|
||||
|
||||
dnl Tunnel CE and encapsulated packet Non-ECT
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -2 stdout], [0],
|
||||
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=2.2.2.2,tun_tos=3,tun_ttl=64,,in_port=1,nw_ecn=0,nw_frag=no
|
||||
Datapath actions: drop
|
||||
@ -131,13 +131,13 @@ AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
||||
dnl Basic
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=4,ttl=128,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x5,src=2.2.2.2,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x5,src=2.2.2.2,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1
|
||||
])
|
||||
|
||||
dnl ECN
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=1,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x5,src=2.2.2.2,dst=1.1.1.1,tos=0x1,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x5,src=2.2.2.2,dst=1.1.1.1,tos=0x1,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1
|
||||
])
|
||||
OVS_VSWITCHD_STOP
|
||||
AT_CLEANUP
|
||||
@ -164,19 +164,19 @@ AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
||||
dnl Basic
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=4,ttl=128,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0x4,ttl=128,tp_src=0,tp_dst=0,flags(df))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0x4,ttl=128,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df))),1
|
||||
])
|
||||
|
||||
dnl ECN
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=5,ttl=128,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0x5,ttl=128,tp_src=0,tp_dst=0,flags(df))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0x5,ttl=128,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df))),1
|
||||
])
|
||||
|
||||
dnl non-IP
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0806),arp(sip=1.2.3.4,tip=5.6.7.8,op=1,sha=00:0f:10:11:12:13,tha=00:14:15:16:17:18)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x0,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df))),1
|
||||
])
|
||||
OVS_VSWITCHD_STOP
|
||||
AT_CLEANUP
|
||||
@ -208,10 +208,10 @@ AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
||||
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(100),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0], [Datapath actions: dnl
|
||||
set(tunnel(tun_id=0x1,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x2,src=0.0.0.0,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x3,src=0.0.0.0,dst=3.3.3.3,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x5,src=0.0.0.0,dst=4.4.4.4,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1
|
||||
set(tunnel(tun_id=0x1,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x2,src=0.0.0.0,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x3,src=0.0.0.0,dst=3.3.3.3,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x5,src=0.0.0.0,dst=4.4.4.4,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1
|
||||
])
|
||||
OVS_VSWITCHD_STOP
|
||||
AT_CLEANUP
|
||||
@ -238,28 +238,28 @@ AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
||||
p3 3/1: (gre: out_key=5, remote_ip=1.1.1.1)
|
||||
])
|
||||
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x1,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x1,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0], [Datapath actions: dnl
|
||||
set(tunnel(tun_id=0x1,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x3,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x5,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1
|
||||
set(tunnel(tun_id=0x1,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x3,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x5,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1
|
||||
])
|
||||
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x2,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x2,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0], [Datapath actions: dnl
|
||||
set(tunnel(tun_id=0x3,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x1,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x5,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1
|
||||
set(tunnel(tun_id=0x3,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x1,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x5,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1
|
||||
])
|
||||
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0], [Datapath actions: dnl
|
||||
set(tunnel(tun_id=0x5,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x1,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x3,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1
|
||||
set(tunnel(tun_id=0x5,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x1,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,dnl
|
||||
set(tunnel(tun_id=0x3,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1
|
||||
])
|
||||
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0xf,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [2], [ignore], [dnl
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0xf,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [2], [ignore], [dnl
|
||||
Invalid datapath flow
|
||||
ovs-appctl: ovs-vswitchd: server returned an error
|
||||
])
|
||||
@ -293,22 +293,22 @@ AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
||||
p5 5/5: (dummy)
|
||||
])
|
||||
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x2,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x2,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0], [dnl
|
||||
Datapath actions: 3
|
||||
])
|
||||
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x3,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x3,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0], [dnl
|
||||
Datapath actions: 4,3,set(tunnel(tun_id=0x3,src=0.0.0.0,dst=3.3.3.3,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,5
|
||||
Datapath actions: 4,3,set(tunnel(tun_id=0x3,src=0.0.0.0,dst=3.3.3.3,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,5
|
||||
])
|
||||
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x3,src=3.3.3.3,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x3,src=3.3.3.3,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0], [dnl
|
||||
Datapath actions: 4,3,5
|
||||
])
|
||||
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0], [dnl
|
||||
Datapath actions: drop
|
||||
])
|
||||
@ -407,7 +407,7 @@ in_port=5 actions=set_field:5->tun_id
|
||||
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
||||
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
|
||||
AT_CHECK([tail -1 stdout], [0],
|
||||
[Datapath actions: set(tunnel(tun_id=0x2a,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,set(tunnel(tun_id=0x2a,src=0.0.0.0,dst=3.3.3.3,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,set(tunnel(tun_id=0x2a,src=1.1.1.1,dst=4.4.4.4,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1,set(tunnel(tun_id=0x3,src=0.0.0.0,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,flags(df,key))),1
|
||||
[Datapath actions: set(tunnel(tun_id=0x2a,src=0.0.0.0,dst=1.1.1.1,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,set(tunnel(tun_id=0x2a,src=0.0.0.0,dst=3.3.3.3,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,set(tunnel(tun_id=0x2a,src=1.1.1.1,dst=4.4.4.4,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1,set(tunnel(tun_id=0x3,src=0.0.0.0,dst=2.2.2.2,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(df,key))),1
|
||||
])
|
||||
OVS_VSWITCHD_STOP
|
||||
AT_CLEANUP
|
||||
|
@ -1097,6 +1097,40 @@ The netmask may be specified as a dotted quad
|
||||
(e.g. \fB192.168.1.0/255.255.255.0\fR) or as a CIDR block
|
||||
(e.g. \fB192.168.1.0/24\fR).
|
||||
.
|
||||
.IP \fBtun_gbp_id=\fIvalue\fR[\fB/\fImask\fR]
|
||||
.IQ \fBtun_gbp_flags=\fIvalue\fR[\fB/\fImask\fR]
|
||||
Matches the group policy identifier and flags in the VXLAN header. Only
|
||||
packets that arrive over a VXLAN tunnel with the "gbp" extension
|
||||
enabled can have this field set. The fields may also be referred to by
|
||||
NXM_NX_TUN_GBP_ID[] (16 bits) and NXM_NX_TUN_GBP_FLAGS[] (8 bits) in
|
||||
the context of field manipulation actions. If these fields are set and
|
||||
the packet matched by the flow is encapsulated in a VXLAN-GBP tunnel,
|
||||
then the policy identifier and flags are transmitted to the destination
|
||||
VXLAN tunnel endpoint.
|
||||
.IP
|
||||
The \fBtun_gbp_flags\fR field has the following format:
|
||||
.IP
|
||||
.in +2
|
||||
\f(CR+-+-+-+-+-+-+-+-+\fR
|
||||
.br
|
||||
\f(CR|-|D|-|-|A|-|-|-|\fR
|
||||
.br
|
||||
\f(CR+-+-+-+-+-+-+-+-+\fR
|
||||
|
||||
.B D :=
|
||||
Don't Learn bit. When set, this bit indicates that the egress
|
||||
tunnel endpoint MUST NOT learn the source address of the encapsulated
|
||||
frame.
|
||||
|
||||
.B A :=
|
||||
Indicates that the group policy has already been applied to
|
||||
this packet. Policies MUST NOT be applied by devices when the A bit is
|
||||
set.
|
||||
.in -2
|
||||
.IP
|
||||
For more information, please see the corresponding IETF draft:
|
||||
https://tools.ietf.org/html/draft-smith-vxlan-group-policy
|
||||
.
|
||||
.IP "\fBreg\fIidx\fB=\fIvalue\fR[\fB/\fImask\fR]"
|
||||
Matches \fIvalue\fR either exactly or with optional \fImask\fR in
|
||||
register number \fIidx\fR. The valid range of \fIidx\fR depends on
|
||||
|
Loading…
x
Reference in New Issue
Block a user