[ovs-dev] [PATCH] ofproto: Limit OVS-assigned port numbers to 32767 and below.

Gurucharan Shetty shettyg at nicira.com
Thu Nov 7 16:28:53 UTC 2013


On Wed, Nov 6, 2013 at 4:12 PM, Ben Pfaff <blp at nicira.com> wrote:
> A couple of controller vendors have mentioned to me that they would like to
> have some part of the OpenFlow port number space reserved for the
> controller to use.  This commit reserves 32768 and up (roughly the upper
> half of the OF1.0 port range) to the controller.
>
> Bug #18753.
> Signed-off-by: Ben Pfaff <blp at nicira.com>

Looks correct to me.

> ---
>  NEWS                 |    3 ++
>  ofproto/ofproto.c    |    8 ++++--
>  vswitchd/vswitch.xml |   75 ++++++++++++++++++++++++++++++++------------------
>  3 files changed, 57 insertions(+), 29 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index 43a2079..1830e3e 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -6,6 +6,9 @@ Post-v2.0.0
>       defaults.
>     - OpenFlow:
>       * The OpenFlow 1.1+ "Write-Actions" instruction is now supported.
> +     * OVS limits the OpenFlow port numbers it assigns to port 32767 and
> +       below, leaving port numbers above that range free for assignment
> +       by the controller.
>     - ovs-vswitchd.conf.db.5 man page will contain graphviz/dot
>       diagram only if graphviz package was installed at the build time.
>     - Support for Linux kernels up to 3.11
> diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> index 0c66a59..d565b19 100644
> --- a/ofproto/ofproto.c
> +++ b/ofproto/ofproto.c
> @@ -2004,9 +2004,13 @@ alloc_ofp_port(struct ofproto *ofproto, const char *netdev_name)
>
>          /* Search for a free OpenFlow port number.  We try not to
>           * immediately reuse them to prevent problems due to old
> -         * flows. */
> +         * flows.
> +         *
> +         * We limit the automatically assigned port numbers to the lower half
> +         * of the port range, to reserve the upper half for assignment by
> +         * controllers. */
>          for (;;) {
> -            if (++ofproto->alloc_port_no >= ofproto->max_ports) {
> +            if (++ofproto->alloc_port_no >= MIN(ofproto->max_ports, 32768)) {
>                  ofproto->alloc_port_no = 1;
>              }
>              last_used_at = ofport_get_usage(ofproto,
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index 52924ee..d2fba34 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -1254,33 +1254,54 @@
>          address.</p>
>        </column>
>
> -      <column name="ofport">
> -        <p>OpenFlow port number for this interface.  Unlike most columns, this
> -        column's value should be set only by Open vSwitch itself.  Other
> -        clients should set this column to an empty set (the default) when
> -        creating an <ref table="Interface"/>.</p>
> -        <p>Open vSwitch populates this column when the port number becomes
> -        known.  If the interface is successfully added,
> -        <ref column="ofport"/> will be set to a number between 1 and 65535
> -        (generally either in the range 1 to 65279, inclusive, or 65534, the
> -        port number for the OpenFlow ``local port'').  If the interface
> -        cannot be added then Open vSwitch sets this column
> -        to -1.</p>
> -        <p>When <ref column="ofport_request"/> is not set, Open vSwitch picks
> -        an appropriate value for this column and then tries to keep the value
> -        constant across restarts.</p>
> -      </column>
> -
> -      <column name="ofport_request">
> -        <p>Requested OpenFlow port number for this interface.  The port
> -        number must be between 1 and 65279, inclusive.  Some datapaths
> -        cannot satisfy all requests for particular port numbers.  When
> -        this column is empty or the request cannot be fulfilled, the
> -        system will choose a free port.  The <ref column="ofport"/>
> -        column reports the assigned OpenFlow port number.</p>
> -        <p>The port number must be requested in the same transaction
> -        that creates the port.</p>
> -      </column>
> +      <group title="OpenFlow Port Number">
> +       <p>
> +         When a client adds a new interface, Open vSwitch chooses an OpenFlow
> +         port number for the new port.  If the client that adds the port fills
> +         in <ref column="ofport_request"/>, then Open vSwitch tries to use its
> +         value as the OpenFlow port number.  Otherwise, or if the requested
> +         port number is already in use or cannot be used for another reason,
> +         Open vSwitch automatically assigns a free port number.  Regardless of
> +         how the port number was obtained, Open vSwitch then reports in <ref
> +         column="ofport"/> the port number actually assigned.
> +       </p>
> +
> +       <p>
> +         Open vSwitch limits the port numbers that it automatically assigns to
> +         the range 1 through 32,767, inclusive.  Controllers therefore have
> +         free use of ports 32,768 and up.
> +       </p>
> +
> +       <column name="ofport">
> +         <p>
> +           OpenFlow port number for this interface.  Open vSwitch sets this
> +           column's value, so other clients should treat it as read-only.
> +         </p>
> +         <p>
> +           The OpenFlow ``local'' port (<code>OFPP_LOCAL</code>) is 65,534.
> +           The other valid port numbers are in the range 1 to 65,279,
> +           inclusive.  Value -1 indicates an error adding the interface.
> +         </p>
> +       </column>
> +
> +       <column name="ofport_request"
> +               type='{"type": "integer", "minInteger": 1, "maxInteger": 65279}'>
> +         <p>
> +           Requested OpenFlow port number for this interface.
> +         </p>
> +
> +         <p>
> +           Open vSwitch currently assigns the OpenFlow port number for an
> +           interface once, when the client first adds the interface.  It does
> +           not change the port number later if the client sets or changes or
> +           clears <ref column="ofport_request"/>.  Therefore, to ensure that
> +           <ref column="ofport_request"/> takes effect, the client should set
> +           it in the same database transaction that creates the interface.
> +           (Future versions of Open vSwitch might honor changes to <ref
> +           column="ofport_request"/>.)
> +         </p>
> +       </column>
> +      </group>
>      </group>
>
>      <group title="System-Specific Details">
> --
> 1.7.10.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list