[ovs-dev] Fail to netdev_open internal iface with error "File exists"

Flavio Leitner fbl at sysclose.org
Thu Jun 22 19:04:44 UTC 2017


On Thu, Jun 22, 2017 at 01:04:59AM +0800, Huanle Han wrote:
> Hi,all
> 
> I get this problem with latest(dbd8112) branch-2.7 code on my Ubuntu.
> root at ubuntu:/var/log/# ovs-vsctl show
> adf2ea99-0c53-4180-914f-7dadaa71302b
>     Bridge test
>         Port test
>             Interface test
>                 type: internal
>     Bridge "manage"
>         Port "manage"
>             Interface "manage"
>                 type: internal
>                 error: "could not open network device manage (File exists)"
>         Port "veth0"
>             Interface "veth0"
>         Port "eth0"
>             Interface "eth0"
>     ovs_version: "2.7.0"
> 
> How to reproduce:
> 1. add bridge "manage", up and add ip on it
> 2. restart ovs-vswitchd
> 3. "ovs-vsctl show" displays error message.
> 
> The reason:
> In following "netdev_open" call on ovs-vswitchd start, input "type" is NULL
> and "manage" is opened as a "system" netdev_class iface incorrectly.
> 
> #0  netdev_open (name=0x7fffffffe2bc "manage", type=0x0,
> netdevp=0x7fffffffc3b0) at ../lib/netdev.c:396
> #1  0x000000000052c492 in get_src_addr (ip6_dst=0x7fffffffe2ac,
> output_bridge=0x7fffffffe2bc "manage", psrc=0x8f3490) at
> ../lib/ovs-router.c:141
> #2  0x000000000052c85d in ovs_router_insert__ (priority=104 'h',
> ip6_dst=0x7fffffffe29c, plen=104 'h', output_bridge=0x7fffffffe2bc
> "manage", gw=0x7fffffffe2ac) at ../lib/ovs-router.c:202
> #3  0x000000000052c980 in ovs_router_insert (ip_dst=0x7fffffffe29c,
> plen=104 'h', output_bridge=0x7fffffffe2bc "manage", gw=0x7fffffffe2ac) at
> ../lib/ovs-router.c:228
> #4  0x000000000058f63a in route_table_handle_msg (change=0x7fffffffe290) at
> ../lib/route-table.c:295
> #5  0x000000000058f1da in route_table_reset () at ../lib/route-table.c:174
> #6  0x000000000058f034 in route_table_init () at ../lib/route-table.c:110
> #7  0x0000000000495838 in dp_initialize () at ../lib/dpif.c:126
> #8  0x0000000000495b40 in dp_enumerate_types (types=0x7fffffffe3a0) at
> ../lib/dpif.c:244
> #9  0x000000000042eb1c in enumerate_types (types=0x7fffffffe3a0) at
> ../ofproto/ofproto-dpif.c:267
> #10 0x000000000041b81c in ofproto_enumerate_types (types=0x7fffffffe3a0) at
> ../ofproto/ofproto.c:432
> #11 0x000000000040df1e in bridge_run__ () at ../vswitchd/bridge.c:3020
> #12 0x000000000040e196 in bridge_run () at ../vswitchd/bridge.c:3082
> #13 0x00000000004138ef in main (argc=1, argv=0x7fffffffe578) at
> ../vswitchd/ovs-vswitchd.c:119
> 
> After then, ovs fails to netdev_open "manage" with type == "internal".
> "File exists" error is reported.
> I think commit d3b8f50(netdev: Fix netdev_open() to adhere to class type if
> given) introduces this problem. It need be improved.

Your analysis is correct.  One solution is to wait vswitchd to
configure first and only then enable ovs-route.  The problem is that
more modules might use netdev_open() and it doesn't sound like a good
idea to have a control per module.

Another option is to map the device's info to a class instead of using
"system", so we could use internal classes for vports, for instance.
However, that doesn't guarantee it will match with what is configured
in the DB.

Thoughts?

-- 
Flavio



More information about the dev mailing list