Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion DataItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,8 @@ class DataItem
const ProtocolConfig * protocfg;
};


///shorthand for a vector of DataItem
typedef std::vector<DataItem> DataItems;

} // namespace LLDLEP

Expand Down
152 changes: 145 additions & 7 deletions DestAdvert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,11 @@ DlepMessageBuffer DestAdvert::get_message_to_send(unsigned int * msg_len)
time(NULL) - begin_time, // uptime
++seq_num, // seqnum
local_rfid, // our radio id
destinations); // advertised destinations
destinations, // advertised destinations
localPeerIpv4DataItems, // advertised ipv4 dataitems
localPeerIpv4SnDataItems, // advertised ipv4 subnet dataitems
localPeerIpv6DataItems, // advertised ipv6 dataitems
localPeerIpv6SnDataItems);// advertised ipv6 subnet dataitems

auto result = build_destination_advert(info);

Expand Down Expand Up @@ -106,7 +110,7 @@ void DestAdvert::handle_message(DlepMessageBuffer msg_buffer,
return;
}

auto result = unbuild_destination_advert(msg_buffer.get(), msg_buffer_len);
auto result = unbuild_destination_advert(msg_buffer.get(), msg_buffer_len, dlep);

if (! result.first)
{
Expand All @@ -132,14 +136,19 @@ void DestAdvert::handle_message(DlepMessageBuffer msg_buffer,
LOG(DLEP_LOG_INFO,
std::ostringstream("new destination advertisement entry!"));

DataItems empty_data_items;
// insert the ip data items to DataItems
DataItems dataItems = dainfo.ipv4DataItems;
dataItems.insert(dataItems.end(), dainfo.ipv4SnDataItems.begin(), dainfo.ipv4SnDataItems.end());
dataItems.insert(dataItems.end(), dainfo.ipv6DataItems.begin(), dainfo.ipv6DataItems.end());
dataItems.insert(dataItems.end(), dainfo.ipv6SnDataItems.begin(), dainfo.ipv6SnDataItems.end());


// new entry, save timestamp and advertisement info
dest_advert_db[dainfo.rfId] = DestAdvertDBEntry {time(NULL),
DestAdvertDBEntry::EntryState::down,
false,
dainfo,
empty_data_items
dataItems
};
}
else
Expand All @@ -152,7 +161,6 @@ void DestAdvert::handle_message(DlepMessageBuffer msg_buffer,

// update timestamp
entry.timestamp = time(NULL);

if (entry.estate == DestAdvertDBEntry::EntryState::up)
{
DlepMacAddrs added, deleted;
Expand All @@ -163,6 +171,17 @@ void DestAdvert::handle_message(DlepMessageBuffer msg_buffer,
getDifference(dainfo.destinations, entry.info.destinations,
added);

msg << "added size " << added.size();
for (auto it = dainfo.destinations.begin(); it != dainfo.destinations.end(); ++it)
{
msg << " dainfo.destinations" << *it;
}
for (auto it = entry.info.destinations.begin(); it != entry.info.destinations.end(); ++it)
{
msg << " entry.info.destinations" << *it;
}
LOG(DLEP_LOG_DEBUG, msg);

for (const DlepMac & mac : added)
{
if (! dlep->local_pdp->addDestination(mac, entry.data_items,
Expand All @@ -173,22 +192,69 @@ void DestAdvert::handle_message(DlepMessageBuffer msg_buffer,
}
}

//update the entry info dataitems with ip dataitems that were just received
std::vector<DataItems> ipParameters = {dainfo.ipv4DataItems, dainfo.ipv4SnDataItems, dainfo.ipv6DataItems, dainfo.ipv6SnDataItems};
for (auto dataItems : ipParameters)
{
DataItems ipdisAdd, ipdisRemove;
for (auto ipdi : dataItems)
{
DataItem::IPFlags ipAdded = ipdi.ip_flags();
//if ip add, then we need to add all new and unique id data items
if (ipAdded == DataItem::IPFlags::add)
{
bool isNewIpDi = true;
for (auto di : entry.data_items)
{
if (di == ipdi)
{
isNewIpDi = false;
}
}
if (isNewIpDi)
{
//add only new ip dataitems
ipdisAdd.push_back(ipdi);
}
}
else //if ip drop remove this ip data item
{
for (auto di : entry.data_items)
{
if (ipdi.ip_equal(di))
{
ipdisRemove.push_back(di);
}
}
}
}
entry.data_items.insert(entry.data_items.end(), ipdisAdd.begin(), ipdisAdd.end());
for (auto ipdir : ipdisRemove)
{
entry.data_items.erase(std::remove(entry.data_items.begin(), entry.data_items.end(), ipdir), entry.data_items.end());
}
}

// handle destinations that were deleted by this advertisement

// old - new = deleted
getDifference(entry.info.destinations, dainfo.destinations,
deleted);

msg << "deleted size " << deleted.size();
LOG(DLEP_LOG_DEBUG, msg);


for (const DlepMac & mac : deleted)
{
entry.data_items.clear();
if (! dlep->local_pdp->removeDestination(mac, true))
{
msg << "destination " << mac << " does not exist";
LOG(DLEP_LOG_ERROR, msg);
}
}
}

// update the entry info to what was just received
entry.info = dainfo;
}
Expand All @@ -207,6 +273,47 @@ void DestAdvert::add_destination(const LLDLEP::DlepMac & mac)
destinations.insert(mac);
}

void DestAdvert::add_dataitem(const LLDLEP::DataItem & di)
{
LOG(DLEP_LOG_INFO, std::ostringstream(di.to_string()));

DataItems* selfDataItems(nullptr);
if (di.name() == ProtocolStrings::IPv4_Address)
{
selfDataItems = &localPeerIpv4DataItems;
}else if (di.name() == ProtocolStrings::IPv4_Attached_Subnet)
{
selfDataItems = &localPeerIpv4SnDataItems;
}else if (di.name() == ProtocolStrings::IPv6_Address)
{
selfDataItems = &localPeerIpv6DataItems;
}else if (di.name() == ProtocolStrings::IPv6_Attached_Subnet)
{
selfDataItems = &localPeerIpv6SnDataItems;
}

DataItems ipdisRemove;
for (auto diRemove : *selfDataItems)
{
if (diRemove.ip_equal(di))
{
ipdisRemove.push_back(diRemove);
}
}
for (auto diRemove : ipdisRemove)
{
selfDataItems->erase(std::remove(selfDataItems->begin(), selfDataItems->end(), diRemove), selfDataItems->end());
}
selfDataItems->push_back(di);
}

void DestAdvert::clear_ipdataitems()
{
localPeerIpv4DataItems.erase(localPeerIpv4DataItems.begin(), localPeerIpv4DataItems.end());
localPeerIpv4SnDataItems.erase(localPeerIpv4SnDataItems.begin(), localPeerIpv4SnDataItems.end());
localPeerIpv6DataItems.erase(localPeerIpv6DataItems.begin(), localPeerIpv6DataItems.end());
localPeerIpv6SnDataItems.erase(localPeerIpv6SnDataItems.begin(), localPeerIpv6SnDataItems.end());
}

void DestAdvert::del_destination(const LLDLEP::DlepMac & mac)
{
Expand Down Expand Up @@ -289,7 +396,38 @@ DestAdvert::update_advert_entry_data_items(const DlepMac & rfId,
if (iter != dest_advert_db.end())
{
DestAdvertDBEntry & entry = iter->second;
entry.data_items = data_items;
DataItems ip_data_items;
//save aside all ip data items
for (auto di : entry.data_items)
{
if (di.name() == ProtocolStrings::IPv4_Address
|| di.name() == ProtocolStrings::IPv4_Attached_Subnet
|| di.name() == ProtocolStrings::IPv6_Address
|| di.name() == ProtocolStrings::IPv6_Attached_Subnet)
{
ip_data_items.push_back(di);
msg << "updating ipdataitems=" << di.to_string();
LOG(DLEP_LOG_INFO, msg);
}
}

//clean entry
entry.data_items.erase(entry.data_items.begin(), entry.data_items.end());

//add all new data items wich are not ip
for (auto di : data_items)
{
if (di.name() != ProtocolStrings::IPv4_Address
&& di.name() != ProtocolStrings::IPv4_Attached_Subnet
&& di.name() != ProtocolStrings::IPv6_Address
&& di.name() != ProtocolStrings::IPv6_Attached_Subnet)
{
entry.data_items.push_back(di);
}
}

//add ip data items that we saved aside
entry.data_items.insert(entry.data_items.end(), ip_data_items.begin(), ip_data_items.end());
}
else
{
Expand Down
26 changes: 26 additions & 0 deletions DestAdvert.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,16 @@ class DestAdvert : public PeriodicMcastSendRcv
/// @param[in] dest the destination to add
void add_destination(const LLDLEP::DlepMac & dest);

/// Add a data item to future dataitems advertisements
/// sent by this process.
///
/// @param[in] di the dataitem to add
void add_dataitem(const LLDLEP::DataItem & di);

/// Remove all ipdataitems from future destination advertisements
/// sent by this process.
void clear_ipdataitems();

/// Remove a destination from future destination advertisements
/// sent by this process.
///
Expand Down Expand Up @@ -134,6 +144,22 @@ class DestAdvert : public PeriodicMcastSendRcv
/// including the peer router mac
LLDLEP::DlepMacAddrs destinations;

/// any local ipv4 to put in destination advertisments,
/// including the peer router ipv4
LLDLEP::DataItems localPeerIpv4DataItems;

/// any local ipv4 subnet to put in destination advertisments,
/// including the peer router ipv4 subnet
LLDLEP::DataItems localPeerIpv4SnDataItems;

/// any local ipv6 to put in destination advertisments,
/// including the peer router ipv6
LLDLEP::DataItems localPeerIpv6DataItems;

/// any local ipv6 subnet to put in destination advertisments,
/// including the peer router ipv6 subnet
LLDLEP::DataItems localPeerIpv6SnDataItems;

/// mutex that should be locked whenever dest_advert_db is accessed
boost::recursive_mutex dest_advert_mutex;

Expand Down
36 changes: 34 additions & 2 deletions DestAdvertInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ struct DestAdvertInfo
std::uint32_t sequenceNumber;
LLDLEP::DlepMac rfId;
LLDLEP::DlepMacAddrs destinations;
LLDLEP::DataItems ipv4DataItems;
LLDLEP::DataItems ipv4SnDataItems;
LLDLEP::DataItems ipv6DataItems;
LLDLEP::DataItems ipv6SnDataItems;

DestAdvertInfo() :
reportInterval {},
Expand All @@ -41,12 +45,20 @@ struct DestAdvertInfo
time_t uptm,
std::uint32_t seq,
const LLDLEP::DlepMac & id,
const LLDLEP::DlepMacAddrs & dests) :
const LLDLEP::DlepMacAddrs & dests,
const LLDLEP::DataItems & ipv4Dest,
const LLDLEP::DataItems & ipv4SnDest,
const LLDLEP::DataItems & ipv6Dest,
const LLDLEP::DataItems & ipv6SnDest) :
reportInterval {interval},
uptime {uptm},
sequenceNumber {seq},
rfId(id),
destinations(dests)
destinations(dests),
ipv4DataItems(ipv4Dest),
ipv4SnDataItems(ipv4SnDest),
ipv6DataItems(ipv6Dest),
ipv6SnDataItems(ipv6SnDest)
{ }

std::string to_string() const
Expand All @@ -64,6 +76,26 @@ struct DestAdvertInfo
ss << dest.to_string() << ", ";
}

for (auto ipdi : ipv4DataItems)
{
ss << ipdi.to_string() << ", ";
}

for (auto ipdi : ipv4SnDataItems)
{
ss << ipdi.to_string() << ", ";
}

for (auto ipdi : ipv6DataItems)
{
ss << ipdi.to_string() << ", ";
}

for (auto ipdi : ipv6SnDataItems)
{
ss << ipdi.to_string() << ", ";
}

return ss.str();
}
};
Expand Down
Loading