Skip to content

Commit 17ff200

Browse files
[swss] Add support for PoE
Add poesyncd daemon Parse PoE-related configs *What I did* Add support for PoE based on sonic-sairedis support of multiple switches. *How I verified it* Builds and tests using VS builds. Signed-off-by: Serhiy Boiko <[email protected]>
1 parent 29cea04 commit 17ff200

23 files changed

+1569
-5
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ cfgmgr/portmgrd
5252
cfgmgr/sflowmgrd
5353
cfgmgr/teammgrd
5454
cfgmgr/vlanmgrd
55+
cfgmgr/poemgrd
5556
cfgmgr/vrfmgrd
5657
cfgmgr/vxlanmgrd
5758
cfgmgr/natmgrd

Makefile.am

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
if GCOV_ENABLED
2-
SUBDIRS = gcovpreload fpmsyncd neighsyncd portsyncd mclagsyncd natsyncd fdbsyncd orchagent swssconfig cfgmgr tests gearsyncd
2+
SUBDIRS = gcovpreload fpmsyncd neighsyncd portsyncd mclagsyncd natsyncd fdbsyncd orchagent swssconfig cfgmgr tests gearsyncd poesyncd
33
else
4-
SUBDIRS = fpmsyncd neighsyncd portsyncd mclagsyncd natsyncd fdbsyncd orchagent swssconfig cfgmgr tests gearsyncd
4+
SUBDIRS = fpmsyncd neighsyncd portsyncd mclagsyncd natsyncd fdbsyncd orchagent swssconfig cfgmgr tests gearsyncd poesyncd
55
endif
66

77

cfgmgr/Makefile.am

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ LIBNL_LIBS = -lnl-genl-3 -lnl-route-3 -lnl-3
55
SAIMETA_LIBS = -lsaimeta -lsaimetadata -lzmq
66
COMMON_LIBS = -lswsscommon -lpthread
77

8-
bin_PROGRAMS = vlanmgrd teammgrd portmgrd intfmgrd buffermgrd vrfmgrd nbrmgrd vxlanmgrd sflowmgrd natmgrd coppmgrd tunnelmgrd macsecmgrd fabricmgrd
8+
bin_PROGRAMS = vlanmgrd teammgrd portmgrd intfmgrd buffermgrd vrfmgrd nbrmgrd vxlanmgrd sflowmgrd natmgrd coppmgrd tunnelmgrd macsecmgrd fabricmgrd poemgrd
99

1010
cfgmgrdir = $(datadir)/swss
1111

@@ -101,6 +101,11 @@ macsecmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CF
101101
macsecmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
102102
macsecmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
103103

104+
poemgrd_SOURCES = poemgrd.cpp poemgr.cpp $(COMMON_ORCH_SOURCE) shellcmd.h
105+
poemgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
106+
poemgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
107+
poemgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
108+
104109
if GCOV_ENABLED
105110
vlanmgrd_SOURCES += ../gcovpreload/gcovpreload.cpp
106111
teammgrd_SOURCES += ../gcovpreload/gcovpreload.cpp
@@ -116,6 +121,7 @@ natmgrd_SOURCES += ../gcovpreload/gcovpreload.cpp
116121
coppmgrd_SOURCES += ../gcovpreload/gcovpreload.cpp
117122
tunnelmgrd_SOURCES += ../gcovpreload/gcovpreload.cpp
118123
macsecmgrd_SOURCES += ../gcovpreload/gcovpreload.cpp
124+
poemgrd_SOURCES += ../gcovpreload/gcovpreload.cpp
119125
endif
120126

121127
if ASAN_ENABLED
@@ -133,5 +139,6 @@ coppmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
133139
tunnelmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
134140
macsecmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
135141
fabricmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
142+
poemgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
136143
endif
137144

cfgmgr/poemgr.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include "poemgr.h"
2+
#include "logger.h"
3+
#include "tokenize.h"
4+
#include "warm_restart.h"
5+
#include "converter.h"
6+
7+
using namespace swss;
8+
9+
PoeMgr::PoeMgr(DBConnector *appDb, DBConnector *cfgDb, const std::vector<std::string> &poeTables) :
10+
Orch(cfgDb, poeTables),
11+
m_appPoeTable(appDb, APP_POE_TABLE_NAME)
12+
{
13+
SWSS_LOG_ENTER();
14+
}
15+
16+
void PoeMgr::doTask(Consumer &consumer)
17+
{
18+
SWSS_LOG_ENTER();
19+
std::string table_name = consumer.getTableName();
20+
if (table_name != CFG_POE_TABLE_NAME)
21+
{
22+
SWSS_LOG_ERROR("Unknown config table %s ", table_name.c_str());
23+
throw std::runtime_error("PoeMgr doTask failure.");
24+
}
25+
26+
auto it = consumer.m_toSync.begin();
27+
while (it != consumer.m_toSync.end())
28+
{
29+
KeyOpFieldsValuesTuple t = it->second;
30+
std::string alias = kfvKey(t);
31+
std::string op = kfvOp(t);
32+
33+
SWSS_LOG_NOTICE("TABLE key: %s : %s", alias.c_str(), op.c_str());
34+
if (op == SET_COMMAND)
35+
{
36+
SWSS_LOG_NOTICE("Add PoE port: %s", alias.c_str());
37+
m_appPoeTable.set(alias, kfvFieldsValues(t));
38+
}
39+
else if (op == DEL_COMMAND)
40+
{
41+
SWSS_LOG_NOTICE("Removing PoE port: %s", alias.c_str());
42+
m_appPoeTable.del(alias);
43+
}
44+
else
45+
{
46+
SWSS_LOG_ERROR("Unknown operation type %s", op.c_str());
47+
}
48+
it = consumer.m_toSync.erase(it);
49+
}
50+
}

cfgmgr/poemgr.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#ifndef __POEMGR__
2+
#define __POEMGR__
3+
4+
#include "dbconnector.h"
5+
#include "producerstatetable.h"
6+
#include "orch.h"
7+
8+
#include <string>
9+
#include <vector>
10+
11+
namespace swss {
12+
13+
class PoeMgr : public Orch
14+
{
15+
public:
16+
PoeMgr(DBConnector *appDb, DBConnector *cfgDb, const std::vector<std::string> &poeTables);
17+
using Orch::doTask;
18+
19+
private:
20+
ProducerStateTable m_appPoeTable;
21+
22+
void doTask(Consumer &consumer);
23+
24+
};
25+
26+
}
27+
28+
#endif

cfgmgr/poemgrd.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include <vector>
2+
3+
#include "poemgr.h"
4+
#include "dbconnector.h"
5+
#include "select.h"
6+
#include "warm_restart.h"
7+
8+
using namespace swss;
9+
10+
/* select() function timeout retry time, in millisecond */
11+
#define SELECT_TIMEOUT 1000
12+
13+
14+
int main(int argc, char **argv)
15+
{
16+
Logger::linkToDbNative("poemgrd");
17+
SWSS_LOG_ENTER();
18+
19+
SWSS_LOG_NOTICE("--- Starting poemgrd ---");
20+
21+
try
22+
{
23+
std::vector<std::string> cfg_tables = {
24+
CFG_POE_TABLE_NAME,
25+
};
26+
27+
DBConnector cfgDb("CONFIG_DB", 0);
28+
DBConnector appDb("APPL_DB", 0);
29+
30+
WarmStart::initialize("poemgrd", "swss");
31+
WarmStart::checkWarmStart("poemgrd", "swss");
32+
33+
PoeMgr manager(&appDb, &cfgDb, cfg_tables);
34+
35+
std::vector<Orch *> cfgOrchList = {&manager};
36+
37+
Select s;
38+
for (Orch *o : cfgOrchList)
39+
{
40+
s.addSelectables(o->getSelectables());
41+
}
42+
43+
SWSS_LOG_NOTICE("starting main loop");
44+
while (true)
45+
{
46+
Selectable *sel;
47+
int ret;
48+
49+
ret = s.select(&sel, SELECT_TIMEOUT);
50+
if (ret == Select::ERROR)
51+
{
52+
SWSS_LOG_NOTICE("Error: %s!", strerror(errno));
53+
continue;
54+
}
55+
if (ret == Select::TIMEOUT)
56+
{
57+
manager.doTask();
58+
continue;
59+
}
60+
61+
auto *c = (Executor *)sel;
62+
c->execute();
63+
}
64+
}
65+
catch(const std::exception &e)
66+
{
67+
SWSS_LOG_ERROR("Runtime error: %s", e.what());
68+
}
69+
return -1;
70+
}

configure.ac

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ AC_CONFIG_FILES([
150150
fpmsyncd/Makefile
151151
neighsyncd/Makefile
152152
gearsyncd/Makefile
153+
poesyncd/Makefile
153154
fdbsyncd/Makefile
154155
natsyncd/Makefile
155156
portsyncd/Makefile

0 commit comments

Comments
 (0)