Skip to content

Commit b0bee3e

Browse files
committed
address review comments
Signed-off-by: Dante Su <[email protected]>
1 parent c4345ef commit b0bee3e

File tree

4 files changed

+70
-30
lines changed

4 files changed

+70
-30
lines changed

orchagent/port.h

+1
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class Port
176176

177177
bool m_fec_cfg = false;
178178
bool m_an_cfg = false;
179+
bool m_port_cap_lt = false; /* Port Capability - LinkTraining */
179180
};
180181

181182
}

orchagent/portsorch.cpp

+56-24
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,6 @@ static bool isValidPortTypeForLagMember(const Port& port)
325325
PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector<table_name_with_pri_t> &tableNames, DBConnector *chassisAppDb) :
326326
Orch(db, tableNames),
327327
m_portStateTable(stateDb, STATE_PORT_TABLE_NAME),
328-
m_stateLinkTrainingTable(stateDb, STATE_LINK_TRAINING_TABLE_NAME),
329328
port_stat_manager(PORT_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, PORT_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false),
330329
port_buffer_drop_stat_manager(PORT_BUFFER_DROP_STAT_FLEX_COUNTER_GROUP, StatsMode::READ, PORT_BUFFER_DROP_STAT_POLLING_INTERVAL_MS, false),
331330
queue_stat_manager(QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, QUEUE_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false),
@@ -1932,7 +1931,7 @@ void PortsOrch::initPortSupportedSpeeds(const std::string& alias, sai_object_id_
19321931
m_portStateTable.set(alias, v);
19331932
}
19341933

1935-
void PortsOrch::initPortCapabilityLinkTraining(const Port &port)
1934+
void PortsOrch::initPortCapLinkTraining(Port &port)
19361935
{
19371936
sai_status_t status;
19381937
sai_attribute_t attr;
@@ -1941,11 +1940,11 @@ void PortsOrch::initPortCapabilityLinkTraining(const Port &port)
19411940
status = sai_port_api->set_port_attribute(port.m_port_id, &attr);
19421941
if (status == SAI_STATUS_SUCCESS)
19431942
{
1944-
string supp = attr.value.booldata ? "yes" : "no";
1945-
m_stateLinkTrainingTable.hset(port.m_alias, "supported", supp);
1943+
port.m_port_cap_lt = attr.value.booldata;
19461944
}
19471945
else
19481946
{
1947+
port.m_port_cap_lt = true; /* This is for vstest */
19491948
SWSS_LOG_NOTICE("Unable to get %s LT capability", port.m_alias.c_str());
19501949
}
19511950
}
@@ -2218,17 +2217,6 @@ task_process_status PortsOrch::setPortAutoNeg(sai_object_id_t id, int an)
22182217
return task_success;
22192218
}
22202219

2221-
bool PortsOrch::getPortCapabilityLinkTraining(const Port& port)
2222-
{
2223-
string supp;
2224-
2225-
if (m_stateLinkTrainingTable.hget(port.m_alias, "supported", supp))
2226-
{
2227-
return (supp == "yes") ? true : false;
2228-
}
2229-
return false;
2230-
}
2231-
22322220
task_process_status PortsOrch::setPortLinkTraining(const Port &port, bool state)
22332221
{
22342222
SWSS_LOG_ENTER();
@@ -2480,7 +2468,7 @@ bool PortsOrch::initPort(const string &alias, const string &role, const int inde
24802468
initGearboxPort(p);
24812469

24822470
/* Initialize port capabilities */
2483-
initPortCapabilityLinkTraining(p);
2471+
initPortCapLinkTraining(p);
24842472

24852473
/* Add port to port list */
24862474
m_portList[alias] = p;
@@ -3081,7 +3069,7 @@ void PortsOrch::doPortTask(Consumer &consumer)
30813069
lt = link_training_mode_map[lt_str];
30823070
if (lt != p.m_link_training)
30833071
{
3084-
if (!getPortCapabilityLinkTraining(p))
3072+
if (!p.m_port_cap_lt)
30853073
{
30863074
SWSS_LOG_ERROR("%s: LT is not supported by the ASIC", alias.c_str());
30873075
// Don't retry
@@ -3103,10 +3091,11 @@ void PortsOrch::doPortTask(Consumer &consumer)
31033091
}
31043092
continue;
31053093
}
3106-
m_stateLinkTrainingTable.hset(p.m_alias, "status", lt > 0 ? "on" : "off");
3094+
m_portStateTable.hset(alias, "link_training_status", lt_str);
31073095
SWSS_LOG_NOTICE("Set port %s LT from %d to %d", alias.c_str(), p.m_link_training, lt);
31083096
p.m_link_training = lt;
31093097
m_portList[alias] = p;
3098+
updatePortStatePoll(p, PORT_STATE_POLL_LT, (lt > 0));
31103099
}
31113100
}
31123101

@@ -5938,6 +5927,19 @@ void PortsOrch::updatePortOperStatus(Port &port, sai_port_oper_status_t status)
59385927
if (port.m_type == Port::PHY)
59395928
{
59405929
updateDbPortOperStatus(port, status);
5930+
if (port.m_admin_state_up && port.m_link_training > 0)
5931+
{
5932+
updatePortStateLinkTraining(port);
5933+
if (status == SAI_PORT_OPER_STATUS_UP)
5934+
{
5935+
updatePortStatePoll(port, PORT_STATE_POLL_LT, false);
5936+
}
5937+
else
5938+
{
5939+
/* Restart port state polling upon link down event */
5940+
updatePortStatePoll(port, PORT_STATE_POLL_LT, true);
5941+
}
5942+
}
59415943
}
59425944
port.m_oper_status = status;
59435945

@@ -7127,7 +7129,7 @@ bool PortsOrch::decrFdbCount(const std::string& alias, int count)
71277129
return true;
71287130
}
71297131

7130-
void PortsOrch::updatePortLinkTrainingStatus(const Port &port)
7132+
void PortsOrch::updatePortStateLinkTraining(const Port &port)
71317133
{
71327134
SWSS_LOG_ENTER();
71337135

@@ -7138,7 +7140,7 @@ void PortsOrch::updatePortLinkTrainingStatus(const Port &port)
71387140

71397141
string status = "off";
71407142

7141-
if ((port.m_link_training > 0) && getPortCapabilityLinkTraining(port))
7143+
if ((port.m_link_training > 0) && port.m_port_cap_lt)
71427144
{
71437145
sai_port_link_training_rx_status_t rx_status;
71447146
sai_port_link_training_failure_status_t failure;
@@ -7164,15 +7166,45 @@ void PortsOrch::updatePortLinkTrainingStatus(const Port &port)
71647166
}
71657167
}
71667168
}
7167-
m_stateLinkTrainingTable.hset(port.m_alias, "status", status);
7169+
7170+
m_portStateTable.hset(port.m_alias, "link_training_status", status);
7171+
}
7172+
7173+
void PortsOrch::updatePortStatePoll(const Port &port, port_state_poll_t type, bool set)
7174+
{
7175+
if (type == PORT_STATE_POLL_NONE)
7176+
{
7177+
return;
7178+
}
7179+
if (set)
7180+
{
7181+
m_port_state_poll[port.m_alias] |= type;
7182+
m_timer->start();
7183+
}
7184+
else
7185+
{
7186+
m_port_state_poll[port.m_alias] &= ~type;
7187+
}
71687188
}
71697189

71707190
void PortsOrch::doTask(swss::SelectableTimer &timer)
71717191
{
7172-
SWSS_LOG_ENTER();
7192+
Port port;
71737193

7174-
for (auto it = m_portList.begin(); it != m_portList.end(); ++it)
7194+
for (auto it = m_port_state_poll.begin(); it != m_port_state_poll.end(); ++it)
7195+
{
7196+
if ((it->second == 0) || !getPort(it->first, port))
7197+
{
7198+
m_port_state_poll.erase(it);
7199+
continue;
7200+
}
7201+
if (port.m_admin_state_up && (it->second & PORT_STATE_POLL_LT))
7202+
{
7203+
updatePortStateLinkTraining(port);
7204+
}
7205+
}
7206+
if (m_port_state_poll.size() == 0)
71757207
{
7176-
updatePortLinkTrainingStatus(it->second);
7208+
m_timer->stop();
71777209
}
71787210
}

orchagent/portsorch.h

+11-4
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ class PortsOrch : public Orch, public Subject
185185
unique_ptr<ProducerTable> m_flexCounterTable;
186186
unique_ptr<ProducerTable> m_flexCounterGroupTable;
187187
Table m_portStateTable;
188-
Table m_stateLinkTrainingTable;
189188

190189
std::string getQueueWatermarkFlexCounterTableKey(std::string s);
191190
std::string getPriorityGroupWatermarkFlexCounterTableKey(std::string s);
@@ -294,8 +293,7 @@ class PortsOrch : public Orch, public Subject
294293
bool initPort(const string &alias, const string &role, const int index, const set<int> &lane_set);
295294
void deInitPort(string alias, sai_object_id_t port_id);
296295

297-
void initPortCapabilityLinkTraining(const Port &port);
298-
bool getPortCapabilityLinkTraining(const Port& port);
296+
void initPortCapLinkTraining(Port &port);
299297

300298
bool setPortAdminStatus(Port &port, bool up);
301299
bool getPortAdminStatus(sai_object_id_t id, bool& up);
@@ -345,7 +343,16 @@ class PortsOrch : public Orch, public Subject
345343

346344
bool getPortLinkTrainingRxStatus(const Port &port, sai_port_link_training_rx_status_t &rx_status);
347345
bool getPortLinkTrainingFailure(const Port &port, sai_port_link_training_failure_status_t &failure);
348-
void updatePortLinkTrainingStatus(const Port &port);
346+
347+
typedef enum {
348+
PORT_STATE_POLL_NONE = 0,
349+
PORT_STATE_POLL_AN = 0x00000001, /* Auto Negotiation */
350+
PORT_STATE_POLL_LT = 0x00000002 /* Link Trainig */
351+
} port_state_poll_t;
352+
353+
map<string, uint32_t> m_port_state_poll;
354+
void updatePortStatePoll(const Port &port, port_state_poll_t type, bool set);
355+
void updatePortStateLinkTraining(const Port &port);
349356

350357
void getPortSerdesVal(const std::string& s, std::vector<uint32_t> &lane_values);
351358
bool getPortAdvSpeedsVal(const std::string &s, std::vector<uint32_t> &speed_values);

tests/test_port_lt.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ def test_PortLinkTrainingForce(self, dvs, testlog):
1919
fvs = swsscommon.FieldValuePairs([("link_training","on")])
2020
tbl.set("Ethernet4", fvs)
2121

22-
# validate if autoneg false is pushed to asic db when set first time
22+
# validate if link_training false is pushed to asic db when set first time
2323
port_oid = adb.port_name_map["Ethernet0"]
2424
expected_fields = {"SAI_PORT_ATTR_LINK_TRAINING_ENABLE":"false"}
2525
adb.wait_for_field_match("ASIC_STATE:SAI_OBJECT_TYPE_PORT", port_oid, expected_fields)
2626

27-
# validate if autoneg true is pushed to asic db when set first time
27+
# validate if link_training true is pushed to asic db when set first time
2828
port_oid = adb.port_name_map["Ethernet4"]
2929
expected_fields = {"SAI_PORT_ATTR_LINK_TRAINING_ENABLE":"true"}
3030
adb.wait_for_field_match("ASIC_STATE:SAI_OBJECT_TYPE_PORT", port_oid, expected_fields)

0 commit comments

Comments
 (0)