summaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorBen Pfaff <blp@ovn.org>2017-04-05 23:08:09 -0700
committerBen Pfaff <blp@ovn.org>2017-04-07 15:50:50 -0700
commit2f2b904f9e28afaff3dfb7adaa62b96c0d144ace (patch)
tree97ed6aa637b4c93cc2386e87436675b62e26d1a9 /ofproto
parentb2342f7a4bcadf60a368855de085ff12ae6a9d20 (diff)
downloadopenvswitch-2f2b904f9e28afaff3dfb7adaa62b96c0d144ace.tar.gz
Add support for OpenFlow 1.6 (draft) port status and port mod messages.
OpenFlow 1.6 adds support for EUI-64 addresses for ports, and extends the maximum length of OpenFlow port names from 16 to 64 bytes. ONF-JIRA: EXT-566 Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Andy Zhou <azhou@ovn.org>
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif-xlate.c2
-rw-r--r--ofproto/ofproto-dpif.c6
-rw-r--r--ofproto/ofproto.c6
3 files changed, 9 insertions, 5 deletions
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index ca286e372..a24aef9a4 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -4597,7 +4597,7 @@ xlate_output_trunc_action(struct xlate_ctx *ctx,
{
bool support_trunc = ctx->xbridge->support.trunc;
struct ovs_action_trunc *trunc;
- char name[OFP_MAX_PORT_NAME_LEN];
+ char name[OFP10_MAX_PORT_NAME_LEN];
switch (port) {
case OFPP_TABLE:
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 9556a0e0c..6a5ffb94f 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -4845,7 +4845,7 @@ ofproto_unixctl_fdb_show(struct unixctl_conn *conn, int argc OVS_UNUSED,
ovs_rwlock_rdlock(&ofproto->ml->rwlock);
LIST_FOR_EACH (e, lru_node, &ofproto->ml->lrus) {
struct ofbundle *bundle = mac_entry_get_port(ofproto->ml, e);
- char name[OFP_MAX_PORT_NAME_LEN];
+ char name[OFP10_MAX_PORT_NAME_LEN];
ofputil_port_to_string(ofbundle_get_a_port(bundle)->up.ofp_port,
name, sizeof name);
@@ -4886,7 +4886,7 @@ ofproto_unixctl_mcast_snooping_show(struct unixctl_conn *conn,
ovs_rwlock_rdlock(&ofproto->ms->rwlock);
LIST_FOR_EACH (grp, group_node, &ofproto->ms->group_lru) {
LIST_FOR_EACH(b, bundle_node, &grp->bundle_lru) {
- char name[OFP_MAX_PORT_NAME_LEN];
+ char name[OFP10_MAX_PORT_NAME_LEN];
bundle = b->port;
ofputil_port_to_string(ofbundle_get_a_port(bundle)->up.ofp_port,
@@ -4900,7 +4900,7 @@ ofproto_unixctl_mcast_snooping_show(struct unixctl_conn *conn,
/* ports connected to multicast routers */
LIST_FOR_EACH(mrouter, mrouter_node, &ofproto->ms->mrouter_lru) {
- char name[OFP_MAX_PORT_NAME_LEN];
+ char name[OFP10_MAX_PORT_NAME_LEN];
bundle = mrouter->port;
ofputil_port_to_string(ofbundle_get_a_port(bundle)->up.ofp_port,
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 84ea95b0c..7440d5b52 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -2346,6 +2346,7 @@ ofport_open(struct ofproto *ofproto,
}
pp->port_no = ofproto_port->ofp_port;
netdev_get_etheraddr(netdev, &pp->hw_addr);
+ pp->hw_addr64 = eth_addr64_zero;
ovs_strlcpy(pp->name, ofproto_port->name, sizeof pp->name);
netdev_get_flags(netdev, &flags);
pp->config = flags & NETDEV_UP ? 0 : OFPUTIL_PC_PORT_DOWN;
@@ -2366,6 +2367,7 @@ ofport_equal(const struct ofputil_phy_port *a,
const struct ofputil_phy_port *b)
{
return (eth_addr_equals(a->hw_addr, b->hw_addr)
+ && eth_addr64_equals(a->hw_addr64, b->hw_addr64)
&& a->state == b->state
&& !((a->config ^ b->config) & OFPUTIL_PC_PORT_DOWN)
&& a->curr == b->curr
@@ -2460,6 +2462,7 @@ static void
ofport_modified(struct ofport *port, struct ofputil_phy_port *pp)
{
port->pp.hw_addr = pp->hw_addr;
+ port->pp.hw_addr64 = pp->hw_addr64;
port->pp.config = ((port->pp.config & ~OFPUTIL_PC_PORT_DOWN)
| (pp->config & OFPUTIL_PC_PORT_DOWN));
port->pp.state = ((port->pp.state & ~OFPUTIL_PS_LINK_DOWN)
@@ -3630,7 +3633,8 @@ port_mod_start(struct ofconn *ofconn, struct ofputil_port_mod *pm,
if (!*port) {
return OFPERR_OFPPMFC_BAD_PORT;
}
- if (!eth_addr_equals((*port)->pp.hw_addr, pm->hw_addr)) {
+ if (!eth_addr_equals((*port)->pp.hw_addr, pm->hw_addr) ||
+ !eth_addr64_equals((*port)->pp.hw_addr64, pm->hw_addr64)) {
return OFPERR_OFPPMFC_BAD_HW_ADDR;
}
return 0;