2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-30 22:05:19 +00:00

openflow: Support matching and modifying MPLS TTL field.

Occasionally we get asked about this and I don't see a reason not to
support it.

Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Justin Pettit <jpettit@ovn.org>
This commit is contained in:
Ben Pfaff
2016-03-07 20:46:48 -08:00
parent e175dc83c5
commit bef3f465bc
6 changed files with 59 additions and 3 deletions

1
NEWS
View File

@@ -14,6 +14,7 @@ Post-v2.5.0
* OpenFlow 1.3 Extension 230, adding OpenFlow Bundles support, is * OpenFlow 1.3 Extension 230, adding OpenFlow Bundles support, is
now implemented. Only flow mod and port mod messages are supported now implemented. Only flow mod and port mod messages are supported
in bundles. in bundles.
* New OpenFlow extension NXM_NX_MPLS_TTL to provide access to MPLS TTL.
- ovs-ofctl: - ovs-ofctl:
* queue-get-config command now allows a queue ID to be specified. * queue-get-config command now allows a queue ID to be specified.
* '--bundle' option can now be used with OpenFlow 1.3. * '--bundle' option can now be used with OpenFlow 1.3.

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -591,6 +591,23 @@ match_set_mpls_bos(struct match *match, int idx, uint8_t mpls_bos)
flow_set_mpls_bos(&match->flow, idx, mpls_bos); flow_set_mpls_bos(&match->flow, idx, mpls_bos);
} }
/* Modifies 'match' so that the TTL of MPLS label 'idx' is wildcarded. */
void
match_set_any_mpls_ttl(struct match *match, int idx)
{
match->wc.masks.mpls_lse[idx] &= ~htonl(MPLS_TTL_MASK);
flow_set_mpls_ttl(&match->flow, idx, 0);
}
/* Modifies 'match' so that it matches only packets in which the TTL of MPLS
* label 'idx' equals 'mpls_ttl'. */
void
match_set_mpls_ttl(struct match *match, int idx, uint8_t mpls_ttl)
{
match->wc.masks.mpls_lse[idx] |= htonl(MPLS_TTL_MASK);
flow_set_mpls_ttl(&match->flow, idx, mpls_ttl);
}
/* Modifies 'match' so that the MPLS LSE is wildcarded. */ /* Modifies 'match' so that the MPLS LSE is wildcarded. */
void void
match_set_any_mpls_lse(struct match *match, int idx) match_set_any_mpls_lse(struct match *match, int idx)

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -120,6 +120,8 @@ void match_set_any_mpls_tc(struct match *, int idx);
void match_set_mpls_tc(struct match *, int idx, uint8_t); void match_set_mpls_tc(struct match *, int idx, uint8_t);
void match_set_any_mpls_bos(struct match *, int idx); void match_set_any_mpls_bos(struct match *, int idx);
void match_set_mpls_bos(struct match *, int idx, uint8_t); void match_set_mpls_bos(struct match *, int idx, uint8_t);
void match_set_any_mpls_ttl(struct match *, int idx);
void match_set_mpls_ttl(struct match *, int idx, uint8_t);
void match_set_tp_src(struct match *, ovs_be16); void match_set_tp_src(struct match *, ovs_be16);
void match_set_mpls_lse(struct match *, int idx, ovs_be32 lse); void match_set_mpls_lse(struct match *, int idx, ovs_be32 lse);
void match_set_tp_src_masked(struct match *, ovs_be16 port, ovs_be16 mask); void match_set_tp_src_masked(struct match *, ovs_be16 port, ovs_be16 mask);

View File

@@ -271,6 +271,8 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)
return !(wc->masks.mpls_lse[0] & htonl(MPLS_TC_MASK)); return !(wc->masks.mpls_lse[0] & htonl(MPLS_TC_MASK));
case MFF_MPLS_BOS: case MFF_MPLS_BOS:
return !(wc->masks.mpls_lse[0] & htonl(MPLS_BOS_MASK)); return !(wc->masks.mpls_lse[0] & htonl(MPLS_BOS_MASK));
case MFF_MPLS_TTL:
return !(wc->masks.mpls_lse[0] & htonl(MPLS_TTL_MASK));
case MFF_IPV4_SRC: case MFF_IPV4_SRC:
return !wc->masks.nw_src; return !wc->masks.nw_src;
@@ -527,6 +529,7 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value)
case MFF_ETH_DST: case MFF_ETH_DST:
case MFF_ETH_TYPE: case MFF_ETH_TYPE:
case MFF_VLAN_TCI: case MFF_VLAN_TCI:
case MFF_MPLS_TTL:
case MFF_IPV4_SRC: case MFF_IPV4_SRC:
case MFF_IPV4_DST: case MFF_IPV4_DST:
case MFF_IPV6_SRC: case MFF_IPV6_SRC:
@@ -741,6 +744,10 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow,
value->u8 = mpls_lse_to_bos(flow->mpls_lse[0]); value->u8 = mpls_lse_to_bos(flow->mpls_lse[0]);
break; break;
case MFF_MPLS_TTL:
value->u8 = mpls_lse_to_ttl(flow->mpls_lse[0]);
break;
case MFF_IPV4_SRC: case MFF_IPV4_SRC:
value->be32 = flow->nw_src; value->be32 = flow->nw_src;
break; break;
@@ -995,6 +1002,10 @@ mf_set_value(const struct mf_field *mf,
match_set_mpls_bos(match, 0, value->u8); match_set_mpls_bos(match, 0, value->u8);
break; break;
case MFF_MPLS_TTL:
match_set_mpls_ttl(match, 0, value->u8);
break;
case MFF_IPV4_SRC: case MFF_IPV4_SRC:
match_set_nw_src(match, value->be32); match_set_nw_src(match, value->be32);
break; break;
@@ -1301,6 +1312,10 @@ mf_set_flow_value(const struct mf_field *mf,
flow_set_mpls_bos(flow, 0, value->u8); flow_set_mpls_bos(flow, 0, value->u8);
break; break;
case MFF_MPLS_TTL:
flow_set_mpls_ttl(flow, 0, value->u8);
break;
case MFF_IPV4_SRC: case MFF_IPV4_SRC:
flow->nw_src = value->be32; flow->nw_src = value->be32;
break; break;
@@ -1623,6 +1638,10 @@ mf_set_wild(const struct mf_field *mf, struct match *match, char **err_str)
match_set_any_mpls_bos(match, 0); match_set_any_mpls_bos(match, 0);
break; break;
case MFF_MPLS_TTL:
match_set_any_mpls_ttl(match, 0);
break;
case MFF_IPV4_SRC: case MFF_IPV4_SRC:
case MFF_ARP_SPA: case MFF_ARP_SPA:
match_set_nw_src_masked(match, htonl(0), htonl(0)); match_set_nw_src_masked(match, htonl(0), htonl(0));
@@ -1779,6 +1798,7 @@ mf_set(const struct mf_field *mf,
case MFF_MPLS_LABEL: case MFF_MPLS_LABEL:
case MFF_MPLS_TC: case MFF_MPLS_TC:
case MFF_MPLS_BOS: case MFF_MPLS_BOS:
case MFF_MPLS_TTL:
case MFF_IP_PROTO: case MFF_IP_PROTO:
case MFF_IP_TTL: case MFF_IP_TTL:
case MFF_IP_DSCP: case MFF_IP_DSCP:

View File

@@ -1144,6 +1144,21 @@ enum OVS_PACKED_ENUM mf_field_id {
*/ */
MFF_MPLS_BOS, MFF_MPLS_BOS,
/* "mpls_ttl".
*
* The outermost MPLS label's time-to-live (TTL) field, or 0 if no MPLS
* labels are present.
*
* Type: u8.
* Maskable: no.
* Formatting: decimal.
* Prerequisites: MPLS.
* Access: read/write.
* NXM: NXM_NX_MPLS_TTL(30) since v2.6.
* OXM: none.
*/
MFF_MPLS_TTL,
/* ## ---- ## */ /* ## ---- ## */
/* ## IPv4 ## */ /* ## IPv4 ## */
/* ## ---- ## */ /* ## ---- ## */

View File

@@ -1777,7 +1777,7 @@ head_table () {
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 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 tun_ipv6_src tun_ipv6_dst tun_flags tun_gbp_id tun_gbp_flags tun_metadata0 dnl supported on Set-Field: tun_id tun_src tun_dst tun_ipv6_src tun_ipv6_dst tun_flags tun_gbp_id tun_gbp_flags tun_metadata0 dnl
tun_metadata1 tun_metadata2 tun_metadata3 tun_metadata4 tun_metadata5 tun_metadata6 tun_metadata7 tun_metadata8 tun_metadata9 tun_metadata10 tun_metadata11 tun_metadata12 tun_metadata13 tun_metadata14 tun_metadata15 tun_metadata16 tun_metadata17 tun_metadata18 tun_metadata19 tun_metadata20 tun_metadata21 tun_metadata22 tun_metadata23 tun_metadata24 tun_metadata25 tun_metadata26 tun_metadata27 tun_metadata28 tun_metadata29 tun_metadata30 tun_metadata31 tun_metadata32 tun_metadata33 tun_metadata34 tun_metadata35 tun_metadata36 tun_metadata37 tun_metadata38 tun_metadata39 tun_metadata40 tun_metadata41 tun_metadata42 tun_metadata43 tun_metadata44 tun_metadata45 tun_metadata46 tun_metadata47 tun_metadata48 tun_metadata49 tun_metadata50 tun_metadata51 tun_metadata52 tun_metadata53 tun_metadata54 tun_metadata55 tun_metadata56 tun_metadata57 tun_metadata58 tun_metadata59 tun_metadata60 tun_metadata61 tun_metadata62 tun_metadata63 dnl tun_metadata1 tun_metadata2 tun_metadata3 tun_metadata4 tun_metadata5 tun_metadata6 tun_metadata7 tun_metadata8 tun_metadata9 tun_metadata10 tun_metadata11 tun_metadata12 tun_metadata13 tun_metadata14 tun_metadata15 tun_metadata16 tun_metadata17 tun_metadata18 tun_metadata19 tun_metadata20 tun_metadata21 tun_metadata22 tun_metadata23 tun_metadata24 tun_metadata25 tun_metadata26 tun_metadata27 tun_metadata28 tun_metadata29 tun_metadata30 tun_metadata31 tun_metadata32 tun_metadata33 tun_metadata34 tun_metadata35 tun_metadata36 tun_metadata37 tun_metadata38 tun_metadata39 tun_metadata40 tun_metadata41 tun_metadata42 tun_metadata43 tun_metadata44 tun_metadata45 tun_metadata46 tun_metadata47 tun_metadata48 tun_metadata49 tun_metadata50 tun_metadata51 tun_metadata52 tun_metadata53 tun_metadata54 tun_metadata55 tun_metadata56 tun_metadata57 tun_metadata58 tun_metadata59 tun_metadata60 tun_metadata61 tun_metadata62 tun_metadata63 dnl
metadata in_port in_port_oxm pkt_mark ct_mark ct_label 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 icmp_type icmp_code icmpv6_type icmpv6_code nd_target nd_sll nd_tll metadata in_port in_port_oxm pkt_mark ct_mark ct_label 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 mpls_ttl 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 icmp_type icmp_code icmpv6_type icmpv6_code nd_target nd_sll nd_tll
matching: matching:
dp_hash: arbitrary mask dp_hash: arbitrary mask
recirc_id: exact match or wildcard recirc_id: exact match or wildcard
@@ -1884,6 +1884,7 @@ metadata in_port in_port_oxm pkt_mark ct_mark ct_label reg0 reg1 reg2 reg3 reg4
mpls_label: exact match or wildcard mpls_label: exact match or wildcard
mpls_tc: exact match or wildcard mpls_tc: exact match or wildcard
mpls_bos: exact match or wildcard mpls_bos: exact match or wildcard
mpls_ttl: exact match or wildcard
ip_src: arbitrary mask ip_src: arbitrary mask
ip_dst: arbitrary mask ip_dst: arbitrary mask
ipv6_src: arbitrary mask ipv6_src: arbitrary mask