Skip to content

Commit

Permalink
portsyncd: Bringing up VLAN members and removing members logic (sonic…
Browse files Browse the repository at this point in the history
  • Loading branch information
stcheng authored Sep 22, 2016
1 parent 4120d61 commit 8843b58
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 6 deletions.
43 changes: 37 additions & 6 deletions portsyncd/linksync.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include "netmsg.h"
#include "dbconnector.h"
#include "producertable.h"
#include "tokenize.h"

#include "linkcache.h"
#include "portsyncd/linksync.h"

Expand All @@ -21,6 +23,7 @@ using namespace swss;
#define TEAM_DRV_NAME "team"

extern set<string> g_portSet;
extern map<string, set<string>> g_vlanMap;
extern bool g_init;

LinkSync::LinkSync(DBConnector *db) :
Expand All @@ -47,6 +50,21 @@ LinkSync::LinkSync(DBConnector *db) :
}
}
}

vector<KeyOpFieldsValuesTuple> tuples;
m_vlanTableConsumer.getTableContent(tuples);

for (auto tuple : tuples)
{
vector<string> keys = tokenize(kfvKey(tuple), ':');
if (keys.size() != 2)
continue;
string vlan = keys[0];
string member = keys[1];
if (g_vlanMap.find(vlan) == g_vlanMap.end())
g_vlanMap[vlan] = set<string>();
g_vlanMap[vlan].insert(member);
}
}

void LinkSync::onMsg(int nlmsg_type, struct nl_object *obj)
Expand Down Expand Up @@ -86,24 +104,37 @@ void LinkSync::onMsg(int nlmsg_type, struct nl_object *obj)
if (type && !strcmp(type, TEAM_DRV_NAME))
return;

vector<FieldValueTuple> fvVector;

/* VLAN member: A separate entry in VLAN_TABLE will be inserted */
if (master)
{
key = m_ifindexNameMap[master] + ":" + key;
string member_key = m_ifindexNameMap[master] + ":" + key;

if (nlmsg_type == RTM_DELLINK)
m_vlanTableProducer.del(key);
if (nlmsg_type == RTM_DELLINK) /* Will it happen? */
m_vlanTableProducer.del(member_key);
else /* RTM_NEWLINK */
{
vector<FieldValueTuple> fvVector;
FieldValueTuple t("tagging_mode", "untagged");
fvVector.push_back(t);

m_vlanTableProducer.set(key, fvVector);
m_vlanTableProducer.set(member_key, fvVector);
}
}
/* No longer a VLAN member: Check if it was a member before and remove it */
else
{
for (auto i = g_vlanMap.begin(); i != g_vlanMap.end(); i++)
{
set<string> member_set = (*i).second;
if (member_set.find(key) != member_set.end())
{
string member_key = (*i).first + ":" + key;
m_vlanTableProducer.del(member_key);
}
}
}

vector<FieldValueTuple> fvVector;
FieldValueTuple a("admin_status", admin ? "up" : "down");
FieldValueTuple o("oper_status", oper ? "up" : "down");
FieldValueTuple m("mtu", to_string(mtu));
Expand Down
1 change: 1 addition & 0 deletions portsyncd/portsyncd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ using namespace swss;
* to be run only once.
*/
set<string> g_portSet;
map<string, set<string>> g_vlanMap;
bool g_init = false;

void usage()
Expand Down

0 comments on commit 8843b58

Please sign in to comment.