@@ -517,7 +517,12 @@ void PortsOrch::doLagTask(Consumer &consumer)
517
517
else if (op == DEL_COMMAND)
518
518
{
519
519
Port lag;
520
- getPort (lag_alias, lag);
520
+ /* Cannot locate LAG */
521
+ if (!getPort (lag_alias, lag))
522
+ {
523
+ it = consumer.m_toSync .erase (it);
524
+ continue ;
525
+ }
521
526
522
527
if (removeLag (lag))
523
528
it = consumer.m_toSync .erase (it);
@@ -540,20 +545,52 @@ void PortsOrch::doLagTask(Consumer &consumer)
540
545
541
546
if (op == SET_COMMAND)
542
547
{
543
- /* Duplicate entry */
544
- if (lag. m_members . find (port_alias) != lag. m_members . end ( ))
548
+ string linkup_status;
549
+ for ( auto i : kfvFieldsValues (t ))
545
550
{
546
- it = consumer. m_toSync . erase (it);
547
- continue ;
551
+ if ( fvField (i) == " linkup " )
552
+ linkup_status = fvValue (i) ;
548
553
}
549
554
550
- /* Assert the port doesn't belong to any LAG */
551
- assert (!port.m_lag_id && !port.m_lag_member_id );
555
+ /* Add LAG member */
556
+ if (linkup_status == " up" )
557
+ {
558
+ /* Duplicate entry */
559
+ if (lag.m_members .find (port_alias) != lag.m_members .end ())
560
+ {
561
+ it = consumer.m_toSync .erase (it);
562
+ continue ;
563
+ }
564
+
565
+ /* Assert the port doesn't belong to any LAG */
566
+ assert (!port.m_lag_id && !port.m_lag_member_id );
567
+
568
+ if (addLagMember (lag, port))
569
+ it = consumer.m_toSync .erase (it);
570
+ else
571
+ it++;
572
+ }
573
+ /* Remove LAG member */
574
+ else /* linkup_status == "down" */
575
+ {
576
+ assert (lag.m_members .find (port_alias) != lag.m_members .end ());
577
+
578
+ /* Cannot locate LAG or LAG member
579
+ * This happens at the time when teamd starts. The linkup
580
+ * is set to down in the beginning.
581
+ */
582
+ if (!port.m_lag_id || !port.m_lag_member_id )
583
+ {
584
+ it = consumer.m_toSync .erase (it);
585
+ continue ;
586
+ }
587
+
588
+ if (removeLagMember (lag, port))
589
+ it = consumer.m_toSync .erase (it);
590
+ else
591
+ it++;
592
+ }
552
593
553
- if (addLagMember (lag, port))
554
- it = consumer.m_toSync .erase (it);
555
- else
556
- it++;
557
594
}
558
595
else if (op == DEL_COMMAND)
559
596
{
0 commit comments