Tom Henderson activity https://gitlab.com/tomhenderson 2026-03-19T15:45:52Z tag:gitlab.com,2026-03-19:5222858495 Tom Henderson commented on merge request !192 at OpenSim / nr 2026-03-19T15:45:52Z tomhenderson Tom Henderson

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.

tag:gitlab.com,2026-03-19:5220313150 Tom Henderson accepted merge request !2482: GSOC2025 6LoWPAN Neighbour Discovery Protocol (Phase 1) at nsnam / ns-3-dev 2026-03-19T04:00:38Z tomhenderson Tom Henderson

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

  • Extract static helpers for parsing and validating NS/NA/RS/RA packets, separating wire-format concerns from protocol logic
  • Extract static factory methods for constructing NS(EARO), NA(EARO), and RA packets
  • Restructure AddressRegistration() and AddressRegistrationSuccess() into clearly delineated phases (new registration, renewal, RS fallback)
  • General cleanup: log levels, loop style, redundant comments

Bug Fixes

  • Fix multiple bugs in the address registration state machine causing stalled registrations
  • Address Registration Fixes: Analyse address registration flow, identify and fix bugs to ensure working address bootstrapping between singular 6LN and 6LBR
  • Disabling DAD: Disable DAD when necessary to comply with 6LoWPAN ND scenarios that bypass traditional IPv6 DAD

Documentation

  • Create detailed flowcharts to visualize key functions and message handling paths in the 6LoWPAN ND protocol logic
  • Document main methods involved in 6LoWPAN-ND packet exchange, as well as address registration algorithm.
  • Add Sphinx documentation detailing 6LoWPAN-ND in sixlowpan.rst

Features

  • Full unicast ND message exchange (RS/RA/NS/NA) between 6LN and 6LBR with EARO, ABRO, 6CO, 6CIO options
  • Add basic working ROVR generation and validation as detailed in RFC8505
  • Address registration state machine with configurable lifetime, advance re-registration window, and jitter
  • Per-interface binding table at the 6LBR with REACHABLE/STALE lifecycle and configurable stale duration
  • SixLowPanHelper API for installing 6LBR/6LN roles and configuring prefixes and contexts

Tests

  • Unit tests for NS/NA/RS/RA packet parsing and validation
  • Integration tests for end-to-end address bootstrapping with 1–20 6LNs and a single 6LBR
  • ROVR conflict test verifying DUPLICATE_ADDRESS response from the 6LBR

For the list of future extensions and changes, see this issue

The design document can be found here!

tag:gitlab.com,2026-03-19:5220313139 Tom Henderson pushed to project branch master at nsnam / ns-3-dev 2026-03-19T04:00:37Z tomhenderson Tom Henderson

Tom Henderson (1ae527b3) at 19 Mar 04:00

sixlowpan: Add 6LoWPAN-ND GSoC implementation

... and 1 more commit

tag:gitlab.com,2026-03-18:5219650661 Tom Henderson commented on merge request !2482 at nsnam / ns-3-dev 2026-03-18T22:09:29Z tomhenderson Tom Henderson

We decided to squash the history; the interactive rebase would have been too laborious in this case.

tag:gitlab.com,2026-03-18:5218895932 Tom Henderson deleted project branch OrbitalMobiliyHelper at Tom Henderson / nr 2026-03-18T17:54:37Z tomhenderson Tom Henderson

Tom Henderson (f3e1cee1) at 18 Mar 17:54

tag:gitlab.com,2026-03-18:5218770110 Tom Henderson pushed new project branch OrbitalMobiliyHelper at Tom Henderson / ns-3-dev 2026-03-18T17:19:44Z tomhenderson Tom Henderson

Tom Henderson (f3e1cee1) at 18 Mar 17:19

mobility: Add leo-mobility test suite

... and 2573 more commits

tag:gitlab.com,2026-03-18:5218743548 Tom Henderson pushed new project branch OrbitalMobiliyHelper at Tom Henderson / nr 2026-03-18T17:12:22Z tomhenderson Tom Henderson

Tom Henderson (f3e1cee1) at 18 Mar 17:12

mobility: Add leo-mobility test suite

... and 20779 more commits

tag:gitlab.com,2026-03-18:5217478467 Tom Henderson pushed to project branch ai-policy.rst at Tom Henderson / ns-3-dev 2026-03-18T13:01:14Z tomhenderson Tom Henderson

Tom Henderson (c366e1c4) at 18 Mar 13:01

Address Peter's comments

... and 10 more commits

tag:gitlab.com,2026-03-18:5217472356 Tom Henderson pushed to project branch add-agents-md at Tom Henderson / ns-3-dev 2026-03-18T12:59:55Z tomhenderson Tom Henderson

Tom Henderson (737d1ca0) at 18 Mar 12:59

Address Eduardo's comments

... and 7 more commits

tag:gitlab.com,2026-03-18:5217470426 Tom Henderson pushed to project branch 6LoWPAN-ND-P1 at Jie Qi Boh / ns-3-dev 2026-03-18T12:59:28Z tomhenderson Tom Henderson

Tom Henderson (1ae527b3) at 18 Mar 12:59

sixlowpan: Add 6LoWPAN-ND GSoC implementation

... and 3 more commits

tag:gitlab.com,2026-03-17:5215108750 Tom Henderson pushed to project branch 6LoWPAN-ND-P1 at Jie Qi Boh / ns-3-dev 2026-03-17T23:11:32Z tomhenderson Tom Henderson

Tom Henderson (485aeb19) at 17 Mar 23:11

sixlowpan: Add 6LoWPAN-ND GSoC implementation

... and 5 more commits

tag:gitlab.com,2026-03-17:5215053653 Tom Henderson commented on merge request !2763 at nsnam / ns-3-dev 2026-03-17T22:43:12Z tomhenderson Tom Henderson

FWIW, I also use MacPorts instead of Homebrew.

tag:gitlab.com,2026-03-17:5214839482 Tom Henderson commented on issue #1318 at nsnam / ns-3-dev 2026-03-17T21:35:31Z tomhenderson Tom Henderson

Note that I happened to have nr module in this test directory (Gabriel may want to move those over to 5G-LENA tracker).

tag:gitlab.com,2026-03-17:5214793650 Tom Henderson commented on issue #1318 at nsnam / ns-3-dev 2026-03-17T21:22:45Z tomhenderson Tom Henderson

I did not (I did not have an environment to reproduce-- am relying on Gabriel).

tag:gitlab.com,2026-03-17:5214783583 Tom Henderson commented on issue #1318 at nsnam / ns-3-dev 2026-03-17T21:19:10Z tomhenderson Tom Henderson

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.
tag:gitlab.com,2026-03-17:5214589424 Tom Henderson opened issue #1318: non-deterministic find() and sort() risks unmasked by clang++22 changes at nsnam / ns-3-dev 2026-03-17T20:13:48Z tomhenderson Tom Henderson tag:gitlab.com,2026-03-17:5210525837 Tom Henderson pushed to project branch add-agents-md at Tom Henderson / ns-3-dev 2026-03-17T00:33:53Z tomhenderson Tom Henderson

Tom Henderson (17eacbbe) at 17 Mar 00:33

Address Eduardo's comments

tag:gitlab.com,2026-03-17:5210522095 Tom Henderson commented on merge request !2782 at nsnam / ns-3-dev 2026-03-17T00:31:20Z tomhenderson Tom Henderson

I like Tommaso's suggestion below.

  • if not needed for readability, use std::numbers::pi directly
  • if there is a readability improvement for (frequent) use of it, define PI constexpr locally
tag:gitlab.com,2026-03-16:5210313104 Tom Henderson opened merge request !363: doc: Add figure to Makefile clean target at OpenSim / nr 2026-03-16T22:45:35Z tomhenderson Tom Henderson

Fully clean the documentation build

tag:gitlab.com,2026-03-16:5210276339 Tom Henderson pushed new project branch fix-make-clean at Tom Henderson / nr 2026-03-16T22:28:26Z tomhenderson Tom Henderson

Tom Henderson (9f1bc185) at 16 Mar 22:28

doc: Add figure to Makefile clean target

... and 1022 more commits