Page MenuHomeFreeBSD

ndp: Improve robustness of nd_queue
Needs ReviewPublic

Authored by pouria on Tue, Mar 17, 8:57 PM.

Details

Reviewers
glebius
zlei
adrian
Group Reviewers
network
Summary

multiple delayed NAs on same ifa can happen at the same time.
Make sure the previous pending NA for the same ifa is cancelled and reuse its ndq memory.
Also, don't count for non-GRAND NAs.

Test Plan

Increase grand count before running tests:

sysctl net.inet6.ip6.grand_count=10

then, simply run kyua network tests:

kyua -k /usr/tests/Kyuafile sys/net
kyua -k /usr/tests/Kyuafile sys/netinet6
kyua -k /usr/tests/Kyuafile sys/netlink
kyua -k /usr/tests/Kyuafile sys/netgraph

or you can add multiple v6 addresses followed by changing
the mac address of interface.
Do it in jail and destroy it for stress.

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 71473
Build 68356: arc lint + arc unit

Event Timeline

Don't count for grand for delayed solicited NAs.

Reuse ndq and cancel out previous pending NA for same ifa.
@glebius done.

Fix a minor issue on PATH_MASK.

sys/netinet6/nd6_nbr.c
1769–1784

This logic can be achieved without new boolean, just using blocks. Also we need not to leak a lock in case of malloc(9) failure.

1871–1872

I would say that previous version was easier to read. A single version of nd6_queue_rel() that requires lock on entry and returns unlocked. Then in this cycle use return; instead of break;. Basically nd6_queue_stop() doesn't need any changes. And second version of nd6_queue_rel_locked() isn't needed.

I'd suggest to use more specific commit line, e.g. ndp: handle a case when two timers coalesce for the same ifa. Or something else that you can come up with. Just more specific than "make things better" :)