This is currently not standardized anywhere. Until it is, those fields are not settable by openflow.
Signed-off-by: Jiri Benc <jb...@redhat.com> --- lib/meta-flow.c | 42 ++++++++++++++++++++++++++++++++++++++++++ lib/meta-flow.h | 35 +++++++++++++++++++++++++++++++++++ lib/nx-match.c | 4 ++++ 3 files changed, 81 insertions(+) diff --git a/lib/meta-flow.c b/lib/meta-flow.c index 124b5256ced3..2ee8f94152a2 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -114,6 +114,10 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc) return !wc->masks.tunnel.ip_src; case MFF_TUN_DST: return !wc->masks.tunnel.ip_dst; + case MFF_TUN_IPV6_SRC: + return ipv6_mask_is_any(&wc->masks.tunnel.ipv6_src); + case MFF_TUN_IPV6_DST: + return ipv6_mask_is_any(&wc->masks.tunnel.ipv6_dst); case MFF_TUN_ID: case MFF_TUN_TOS: case MFF_TUN_TTL: @@ -408,6 +412,8 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value) case MFF_TUN_ID: case MFF_TUN_SRC: case MFF_TUN_DST: + case MFF_TUN_IPV6_SRC: + case MFF_TUN_IPV6_DST: case MFF_TUN_TOS: case MFF_TUN_TTL: case MFF_TUN_FLAGS: @@ -520,6 +526,12 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow, case MFF_TUN_DST: value->be32 = flow->tunnel.ip_dst; break; + case MFF_TUN_IPV6_SRC: + value->ipv6 = flow->tunnel.ipv6_src; + break; + case MFF_TUN_IPV6_DST: + value->ipv6 = flow->tunnel.ipv6_dst; + break; case MFF_TUN_FLAGS: value->be16 = htons(flow->tunnel.flags); break; @@ -734,6 +746,12 @@ mf_set_value(const struct mf_field *mf, case MFF_TUN_DST: match_set_tun_dst(match, value->be32); break; + case MFF_TUN_IPV6_SRC: + match_set_tun_ipv6_src(match, &value->ipv6); + break; + case MFF_TUN_IPV6_DST: + match_set_tun_ipv6_dst(match, &value->ipv6); + break; case MFF_TUN_FLAGS: match_set_tun_flags(match, ntohs(value->be16)); break; @@ -972,6 +990,12 @@ mf_set_flow_value(const struct mf_field *mf, case MFF_TUN_DST: flow->tunnel.ip_dst = value->be32; break; + case MFF_TUN_IPV6_SRC: + flow->tunnel.ipv6_src = value->ipv6; + break; + case MFF_TUN_IPV6_DST: + flow->tunnel.ipv6_dst = value->ipv6; + break; case MFF_TUN_FLAGS: flow->tunnel.flags = ntohs(value->be16); break; @@ -1236,6 +1260,18 @@ mf_set_wild(const struct mf_field *mf, struct match *match) case MFF_TUN_DST: match_set_tun_dst_masked(match, htonl(0), htonl(0)); break; + case MFF_TUN_IPV6_SRC: + memset(&match->wc.masks.tunnel.ipv6_src, 0, + sizeof match->wc.masks.tunnel.ipv6_src); + memset(&match->flow.tunnel.ipv6_src, 0, + sizeof match->flow.tunnel.ipv6_src); + break; + case MFF_TUN_IPV6_DST: + memset(&match->wc.masks.tunnel.ipv6_dst, 0, + sizeof match->wc.masks.tunnel.ipv6_dst); + memset(&match->flow.tunnel.ipv6_dst, 0, + sizeof match->flow.tunnel.ipv6_dst); + break; case MFF_TUN_FLAGS: match_set_tun_flags_masked(match, 0, 0); break; @@ -1490,6 +1526,12 @@ mf_set(const struct mf_field *mf, case MFF_TUN_DST: match_set_tun_dst_masked(match, value->be32, mask->be32); break; + case MFF_TUN_IPV6_SRC: + match_set_tun_ipv6_src_masked(match, &value->ipv6, &mask->ipv6); + break; + case MFF_TUN_IPV6_DST: + match_set_tun_ipv6_dst_masked(match, &value->ipv6, &mask->ipv6); + break; case MFF_TUN_FLAGS: match_set_tun_flags_masked(match, ntohs(value->be16), ntohs(mask->be16)); break; diff --git a/lib/meta-flow.h b/lib/meta-flow.h index 265f0669fc4f..4fc133293e71 100644 --- a/lib/meta-flow.h +++ b/lib/meta-flow.h @@ -366,6 +366,41 @@ enum OVS_PACKED_ENUM mf_field_id { */ MFF_TUN_DST, + /* "tun_ipv6_src". + * + * The IPv6 source address in the outer IP header of a tunneled packet. + * + * For non-tunneled packets, the value is 0. + * + * Type: IPv6. + * Maskable: bitwise. + * Formatting: IPv6. + * Prerequisites: none. + * Access: read/write. + * NXM: none. + * OXM: none. + * Prefix lookup member: tunnel.ipv6_src. + */ + MFF_TUN_IPV6_SRC, + + /* "tun_ipv6_dst". + * + * The IPv6 destination address in the outer IP header of a tunneled + * packet. + * + * For non-tunneled packets, the value is 0. + * + * Type: IPv6. + * Maskable: bitwise. + * Formatting: IPv6. + * Prerequisites: none. + * Access: read/write. + * NXM: none. + * OXM: none. + * Prefix lookup member: tunnel.ipv6_dst. + */ + MFF_TUN_IPV6_DST, + /* "tun_flags". * * Combination of FLOW_TNL_F_* bitmapped flags that indicate properties of diff --git a/lib/nx-match.c b/lib/nx-match.c index 21f291c6d9e7..c6cae78c3d06 100644 --- a/lib/nx-match.c +++ b/lib/nx-match.c @@ -974,6 +974,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_ipv6(b, MFF_TUN_IPV6_SRC, oxm, + &flow->tunnel.ipv6_src, &match->wc.masks.tunnel.ipv6_src); + nxm_put_ipv6(b, MFF_TUN_IPV6_DST, oxm, + &flow->tunnel.ipv6_dst, &match->wc.masks.tunnel.ipv6_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, -- 1.8.3.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev