Reminder to please document what works and doesn't work, what functionality is in scope vs. out of scope.
Several maintainers add the docs later after big MRs but it doesn't help me to review because I am not a mind reader.
This merge request implements the first phase of the 6LoWPAN Neighbour Discovery Protocol (6LoWPAN-ND) for ns-3 as part of GSOC 2025. It provides mesh-under routing support for a topology comprising multiple 6LoWPAN Nodes (6LNs) and a single 6LoWPAN Border Router (6LBR), conforming to RFC 6775 and RFC 8505.
It includes the following:
Code Refactoring
AddressRegistration() and AddressRegistrationSuccess() into clearly delineated phases (new registration, renewal, RS fallback)Bug Fixes
Documentation
Features
SixLowPanHelper API for installing 6LBR/6LN roles and configuring prefixes and contextsTests
DUPLICATE_ADDRESS response from the 6LBRFor the list of future extensions and changes, see this issue
Tom Henderson (1ae527b3) at 19 Mar 04:00
sixlowpan: Add 6LoWPAN-ND GSoC implementation
... and 1 more commit
We decided to squash the history; the interactive rebase would have been too laborious in this case.
Tom Henderson (f3e1cee1) at 18 Mar 17:54
Tom Henderson (f3e1cee1) at 18 Mar 17:19
mobility: Add leo-mobility test suite
... and 2573 more commits
Tom Henderson (f3e1cee1) at 18 Mar 17:12
mobility: Add leo-mobility test suite
... and 20779 more commits
Tom Henderson (1ae527b3) at 18 Mar 12:59
sixlowpan: Add 6LoWPAN-ND GSoC implementation
... and 3 more commits
Tom Henderson (485aeb19) at 17 Mar 23:11
sixlowpan: Add 6LoWPAN-ND GSoC implementation
... and 5 more commits
FWIW, I also use MacPorts instead of Homebrew.
Note that I happened to have nr module in this test directory (Gabriel may want to move those over to 5G-LENA tracker).
I did not (I did not have an environment to reproduce-- am relying on Gabriel).
I asked Claude Code to write a script to audit ns-3-dev for all std::multimap::find calls, and for std::sort calls on containers of types with equivalent elements.
Here is the program it came up with: audit-multimap-sort.py
Here is the output of the audit:
========================================================================
CHECK 1: std::multimap::find() — consider lower_bound()
========================================================================
contrib/nr/model/nr-a2-a4-rsrq-handover-algorithm.cc:242: auto it2 = it1->second.find(cellId);
contrib/nr/model/nr-epc-gnb-application.cc:284: auto qfiIt = rntiIt->second.find(qfi);
contrib/nr/model/nr-gnb-mac.cc:941: auto lcidIt = rntiIt->second.find(macHeader.GetLcId());
contrib/nr/model/nr-gnb-mac.cc:1263: auto lcidIt = rntiIt->second.find(j.m_lcid);
contrib/nr/model/nr-gnb-mac.cc:1510: auto lcidIt = rntiIt->second.find(lcinfo.lcId);
contrib/nr/model/nr-mac-scheduler-ns3.cc:2512: if (itDuplicated->second.find(it->m_harqProcessId) ==
contrib/nr/model/nr-simple-ue-component-carrier-manager.cc:197: auto it = ccLcMapIt->second.find(params.lcid);
contrib/nr/model/nr-simple-ue-component-carrier-manager.cc:258: auto lcToRemove = it->second.find(lcid);
contrib/nr/test/nr-test-timings.cc:205: auto resMap = numMap->second.find(msg->GetMessageType());
contrib/nr/test/nr-test-timings.cc:297: auto resMap = numMap->second.find(msg->GetMessageType());
contrib/nr/test/nr-test-timings.cc:359: auto resMap = numMap->second.find(msg->GetMessageType());
contrib/nr/test/nr-test-timings.cc:446: auto resMap = numMap->second.find(msg->GetMessageType());
contrib/nr/test/nr-test-timings.cc:540: auto resMap = numMap->second.find(msg->GetMessageType());
contrib/nr/test/nr-test-timings.cc:622: auto resMap = numMap->second.find(msg->GetMessageType());
contrib/nr/test/nr-test-timings.cc:704: auto resMap = numMap->second.find(msg->GetMessageType());
contrib/nr/test/nr-test-timings.cc:784: auto resMap = numMap->second.find(msg->GetMessageType());
src/buildings/model/buildings-propagation-loss-model.cc:155: auto bit = ait->second.find(b);
src/dsr/model/dsr-rcache.cc:341: if (i->second.find(source) != i->second.end())
src/lte/helper/lte-global-pathloss-database.cc:49: auto ueIt = cellIt->second.find(imsi);
src/lte/model/a2-a4-rsrq-handover-algorithm.cc:238: auto it2 = it1->second.find(cellId);
src/lte/model/cqa-ff-mac-scheduler.cc:1143: map_nonGBRHOLgroupToUE.find(group)->second.insert(itRlcBufferReq->first);
src/lte/model/cqa-ff-mac-scheduler.cc:1159: map_GBRHOLgroupToUE.find(group)->second.insert(itRlcBufferReq->first);
src/lte/model/epc-enb-application.cc:277: auto bidIt = rntiIt->second.find(bid);
src/lte/model/lte-enb-mac.cc:740: auto lcidIt = rntiIt->second.find(lcid);
src/lte/model/lte-enb-mac.cc:862: auto lcidIt = rntiIt->second.find(lcinfo.lcId);
src/lte/model/lte-enb-mac.cc:1083: auto lcidIt = rntiIt->second.find(lcid);
src/lte/model/lte-ffr-distributed-algorithm.cc:507: auto it2 = it1->second.find(m_cellId);
src/lte/model/lte-ffr-distributed-algorithm.cc:675: auto it2 = it1->second.find(cellId);
src/lte/model/simple-ue-component-carrier-manager.cc:198: auto it = ccLcMapIt->second.find(params.lcid);
src/lte/model/simple-ue-component-carrier-manager.cc:258: auto lcToRemove = it->second.find(lcid);
src/spectrum/model/two-ray-spectrum-propagation-loss-model.cc:1000: NS_ASSERT_MSG(SIM_PARAMS_TO_FTR_PARAMS_TABLE.find(m_scenario)->second.find(cond) !=
src/spectrum/model/two-ray-spectrum-propagation-loss-model.cc:1003: auto scenAndCondTuple = SIM_PARAMS_TO_FTR_PARAMS_TABLE.find(m_scenario)->second.find(cond);
src/wifi/examples/wifi-bianchi.cc:3241: auto it = itDifs->second.find(n);
src/wifi/examples/wifi-bianchi.cc:3257: auto it = itEifs->second.find(n);
src/wifi/examples/wifi-bianchi.cc:3295: auto it = itDifs->second.find(i);
src/wifi/examples/wifi-bianchi.cc:3317: auto it = itEifs->second.find(i);
src/wifi/model/interference-helper.cc:444: auto it = niIt->second.find(event->GetStartTime());
src/wifi/model/interference-helper.cc:464: it = niIt->second.find(event->GetStartTime());
src/wifi/model/wifi-mac.cc:1341: auto linkSetIt = it->second.find(tid);
========================================================================
CHECK 2: std::sort — review whether std::stable_sort is needed
========================================================================
contrib/nr/model/nr-gnb-phy.cc:1156: std::sort(indexesToDelete.begin(), indexesToDelete.end());
contrib/nr/model/nr-initial-association.cc:444: std::sort(idxVal.begin(), idxVal.end(), [&](int i, int j) {
contrib/nr/model/nr-mac-scheduler-ofdma.cc:484: std::sort(ueVector.begin(), ueVector.end(), [](auto a, auto b) {
src/core/model/command-line.cc:544: std::sort(globals.begin(), globals.end());
src/core/model/command-line.cc:573: std::sort(attributes.begin(), attributes.end());
src/core/model/command-line.cc:630: std::sort(groupTypes.begin(), groupTypes.end());
src/core/model/command-line.cc:653: std::sort(types.begin(), types.end());
src/flow-monitor/model/ipv4-flow-classifier.cc:203: std::sort(v.begin(), v.end(), SortByCount());
src/flow-monitor/model/ipv6-flow-classifier.cc:204: std::sort(v.begin(), v.end(), SortByCount());
src/lte/model/pss-ff-mac-scheduler.cc:1047: std::sort(ueSet1.rbegin(), ueSet1.rend());
src/lte/model/pss-ff-mac-scheduler.cc:1048: std::sort(ueSet2.rbegin(), ueSet2.rend());
src/uan/model/uan-mac-rc-gw.cc:601: std::sort(pds.begin(), pds.end());
src/wifi/helper/wifi-phy-rx-trace-helper.cc:469: std::sort(m_rxTagToListOfOverlappingPpduRecords[it.m_rxTag].begin(),
Summary: 37 multimap::find() call(s), 13 std::sort call(s) to review.
Tom Henderson (17eacbbe) at 17 Mar 00:33
Address Eduardo's comments
I like Tommaso's suggestion below.
Fully clean the documentation build
Tom Henderson (9f1bc185) at 16 Mar 22:28
doc: Add figure to Makefile clean target
... and 1022 more commits