[ovs-dev] [PATCH] ofp-actions: OFPP_ANY (aka OFPP_NONE) is not a valid output port.

Ben Pfaff blp at nicira.com
Wed Jul 29 15:40:04 UTC 2015


On Tue, Jul 28, 2015 at 10:32:50PM -0300, Flavio Leitner wrote:
> On Tue, Jul 28, 2015 at 03:22:46PM -0700, Ben Pfaff wrote:
> > This is implied by the list of ports that are valid for output in the
> > various versions of the OpenFlow specification.
> > 
> > Found by OFTest.
> 
> Looks good to me.
> I wonder how one could set the output port to none.
> 
> Acked-by: Flavio Leitner <fbl at sysclose.org>

Thanks for the review.  I took a closer look on this one too and ended
up adding a pair of tests and adjusting the "bundle" action, which used
ofpact_check_output_port() but had specific behavior for OFPP_NONE.
Here's what I applied to master and branch-2.4:

--8<--------------------------cut here-------------------------->8--

From: Ben Pfaff <blp at nicira.com>
Date: Wed, 29 Jul 2015 08:36:07 -0700
Subject: [PATCH] ofp-actions: OFPP_ANY (aka OFPP_NONE) is not a valid output
 port.

This is implied by the list of ports that are valid for output in the
various versions of the OpenFlow specification.

Found by OFTest.

Signed-off-by: Ben Pfaff <blp at nicira.com>
Acked-by: Flavio Leitner <fbl at sysclose.org>
---
 lib/bundle.c         | 14 +++++++-------
 lib/ofp-actions.c    |  4 +++-
 tests/ofp-actions.at |  8 ++++++++
 3 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/lib/bundle.c b/lib/bundle.c
index f1b1478..baf6bbf 100644
--- a/lib/bundle.c
+++ b/lib/bundle.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, 2012, 2013, 2014 Nicira, Inc.
+/* Copyright (c) 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -117,14 +117,14 @@ bundle_check(const struct ofpact_bundle *bundle, ofp_port_t max_ports,
 
     for (i = 0; i < bundle->n_slaves; i++) {
         ofp_port_t ofp_port = bundle->slaves[i];
-        enum ofperr error;
 
-        error = ofpact_check_output_port(ofp_port, max_ports);
-        if (error) {
-            VLOG_WARN_RL(&rl, "invalid slave %"PRIu16, ofp_port);
-            return error;
+        if (ofp_port != OFPP_NONE) {
+            enum ofperr error = ofpact_check_output_port(ofp_port, max_ports);
+            if (error) {
+                VLOG_WARN_RL(&rl, "invalid slave %"PRIu16, ofp_port);
+                return error;
+            }
         }
-
         /* Controller slaves are unsupported due to the lack of a max_len
          * argument. This may or may not change in the future.  There doesn't
          * seem to be a real-world use-case for supporting it. */
diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index eef3389..14a2802 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -5396,10 +5396,12 @@ ofpact_check_output_port(ofp_port_t port, ofp_port_t max_ports)
     case OFPP_FLOOD:
     case OFPP_ALL:
     case OFPP_CONTROLLER:
-    case OFPP_NONE:
     case OFPP_LOCAL:
         return 0;
 
+    case OFPP_NONE:
+        return OFPERR_OFPBAC_BAD_OUT_PORT;
+
     default:
         if (ofp_to_u16(port) < ofp_to_u16(max_ports)) {
             return 0;
diff --git a/tests/ofp-actions.at b/tests/ofp-actions.at
index 39401f3..6308682 100644
--- a/tests/ofp-actions.at
+++ b/tests/ofp-actions.at
@@ -135,6 +135,9 @@ ffff 0018 00002320 001d 3039 00005BA0 00008707 0000B26E
 & ofp_actions|WARN|OpenFlow action NXAST_DEC_TTL_CNT_IDS length 17 is not a multiple of 8
 ffff 0011 00002320 0015 0001 00000000 0000000000000000
 
+# bad OpenFlow10 actions: OFPBAC_BAD_OUT_PORT
+0000 0008 ffff 0000
+
 ])
 sed '/^[[#&]]/d' < test-data > input.txt
 sed -n 's/^# //p; /^$/p' < test-data > expout
@@ -297,6 +300,11 @@ ffff 0020 00002320 0015 000500000000 80003039005A02fd 0400000000000000
 # actions=sample(probability=12345,collector_set_id=23456,obs_domain_id=34567,obs_point_id=45678)
 ffff 0018 00002320 001d 3039 00005BA0 00008707 0000B26E
 
+# bad OpenFlow11 actions: OFPBAC_BAD_OUT_PORT
+& ofp_actions|WARN|bad action at offset 0 (OFPBAC_BAD_OUT_PORT):
+& 00000000  00 00 00 10 ff ff ff ff-00 00 00 00 00 00 00 00
+0000 0010 ffffffff 0000 000000000000
+
 ])
 sed '/^[[#&]]/d' < test-data > input.txt
 sed -n 's/^# //p; /^$/p' < test-data > expout
-- 
2.1.3




More information about the dev mailing list