[ovs-dev] [PATCH] ovn-northd: Only peer router ports to other router ports.

nickcooper-zhangtonghao nickcooper-zhangtonghao at opencloud.tech
Thu Jul 28 02:34:12 UTC 2016


> On Jul 28, 2016, at 5:01 AM, Ben Pfaff <blp at ovn.org> wrote:
> 
> On Mon, Jul 25, 2016 at 09:19:00AM -0700, nickcooper-zhangtonghao wrote:
>> Deletion of a logical router port, which may be an other
>> router peer, result in a WARN, because the "ports" variable
>> still contains the logical port deleted. This port exists
>> but should not have been initialized fully.
>> 
>> nbsp == NULL, nbrp == NULL
>> 
>> It is necessary to check 'nbsp'.
>> 
>> A router port's "peer", if set, must point to another router port, but the
>> code as written also accepted switch ports.  This caused problems when
>> switch ports were actually specified.
>> 
>> Reported-by: Gurucharan Shetty <guru at ovn.org>
>> Reported-at: http://openvswitch.org/pipermail/dev/2016-July/075524.html
>> Signed-off-by: Ben Pfaff <blp at ovn.org>
>> Acked-by: Gurucharan Shetty <guru at ovn.org>
>> Signed-off-by: nickcooper-zhangtonghao <nickcooper-zhangtonghao at opencloud.tech>
>> ---
>> ovn/northd/ovn-northd.c | 8 +++++++-
>> 1 file changed, 7 insertions(+), 1 deletion(-)
>> 
>> diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
>> index a3d1672..efc915c 100644
>> --- a/ovn/northd/ovn-northd.c
>> +++ b/ovn/northd/ovn-northd.c
>> @@ -746,9 +746,15 @@ join_logical_ports(struct northd_context *ctx,
>>         } else if (op->nbrp && op->nbrp->peer) {
>>             struct ovn_port *peer = ovn_port_find(ports, op->nbrp->peer);
>>             if (peer) {
>> +                /* Deletion of a logical router port, which may be an other
>> +                 * router peer, result in a WARN, because the "ports" variable
>> +                 * still contains the logical port deleted. This port exists 
>> +                 * but should not have been initialized fully.
>> +                 *
>> +                 * nbsp == NULL, nbrp == NULL */
>>                 if (peer->nbrp) {
>>                     op->peer = peer;
>> -                } else {
>> +                } else if (peer->nbsp) {
>>                     /* An ovn_port for a switch port of type "router" does have
>>                      * a router port as its peer (see the case above for
>>                      * "router" ports), but this is set via options:router-port
> 
> I don't understand this yet.  I don't see how an ovn_port's nbsp and
> nbrp can both be NULL.  I only see two calls to ovn_port_create(), and
> each of them supplies either nbsp or nbrp as nonnull.
> 
> Can you explain further?
> 
> Thanks,
> 
> Ben.


Run the commands below, you will get a WARN info in the ovn-northd.log

ovn-nbctl lr-add lr0
ovn-nbctl lr-add lr1
ovn-nbctl lrp-add lr0 lr0-p0 00:11:22:33:44:55 192.168.10.10/24 peer=lr1-p0
ovn-nbctl lrp-add lr1 lr1-p0 00:11:22:33:44:66 192.168.20.10/24 peer=lr0-p0
ovn-nbctl lrp-del lr1-p0

WARN INFO:
“Bad configuration: The peer of router port lr0-p0 is a switch port.”


Here’s is why:
In the ‘join_logical_ports’ function,  firstly, we get the ‘ovn_port’s from 
SB database and save them to “ports” variable. The ovn_port’s nbsp and nbrp both
are NULL via ovn_port_create.

Next, in the HMAP_FOR_EACH  loop, we initialize the ‘ovn_port’s except which 
were deleted on the NB database. The ovn_port which is deleted in NB database 
is still in SB database. so, still in “ports” variable.

Then, when connected to their peer, the ovn_port deleted may be found as a peer.
But the ovn_port's nbsp and nbsp both are NULL.

Thanks,
zhangtonghao  








More information about the dev mailing list