[ovs-dev] Threaded userspace datapath

Ed Maste emaste at freebsd.org
Wed Aug 15 17:16:58 UTC 2012


>>> There may be some confusion about numbering.  OpenFlow says that the
>>> port number of the "local port" is 65534 (OFPP_LOCAL).  The datapaths,
>>> on the other hand, use port number 0 for the "local port".  There is
>>> supposed to be translation going on at the interface between the
>>> datapath and the OpenFlow implementation, but mistakes can creep in,
>>> especially in new code.
>>
>> Indeed this is the case here - I compared the key for the packet being
>> looked up and the otherwise-matching entry in the hash, and see 0 vs
>> 65534 for the port.
>>
>> -Ed
>
> This fixes it for me, but I'm not certain this is the right place to
> do the translation:
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 60fae5f..7112149 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -1011,7 +1011,7 @@ dp_netdev_port_input(struct dp_netdev *dp,
> struct dp_netdev_port *port,
>      if (packet->size < ETH_HEADER_LEN) {
>          return;
>      }
> -    flow_extract(packet, 0, 0, port->port_no, &key);
> +    flow_extract(packet, 0, 0, ofp_port_to_odp_port(port->port_no), &key);
>      flow = dp_netdev_lookup_flow(dp, &key);
>      if (flow) {
>          dp_netdev_flow_used(flow, &key, packet);

Oops, I had it backwards in the version I posted - thanks Giuseppe for
pointing it out off-list.

This is the version that I tested and pushed to my threaded patch
repo, and Giuseppe confirmed it fixes it for him as well.  It looks
like this bug affects the userspace datapath in general and isn't
specific to the threaded patch or the FreeBSD netdev implementation.

+++ b/lib/dpif-netdev.c
@@ -1011,7 +1011,7 @@ dp_netdev_port_input(struct dp_netdev *dp,
struct dp_netdev_port *port,
     if (packet->size < ETH_HEADER_LEN) {
         return;
     }
-    flow_extract(packet, 0, 0, port->port_no, &key);
+    flow_extract(packet, 0, 0, odp_port_to_ofp_port(port->port_no), &key);
     flow = dp_netdev_lookup_flow(dp, &key);
     if (flow) {
         dp_netdev_flow_used(flow, &key, packet);

-Ed



More information about the dev mailing list