Re: [PATCH 1/1] tidbits: net-udp: solicit new client for server mode
Hannes Diethelm <[email protected]> Wed, 22 Jul 2026 22:45:27 +0200
| Newsgroups | dev.linux.lists.xenomai |
|---|---|
| Message-ID | <[email protected]> |
Am 22.07.26 um 20:36 schrieb Philippe Gerum: > Philippe Gerum <[email protected]> writes: > >> Hannes Diethelm <[email protected]> writes: >> >>> Am 22.07.26 um 00:36 schrieb Hannes Diethelm: >>>> Am 21.07.26 um 22:15 schrieb Philippe Gerum: >>>>> Hannes Diethelm <[email protected]> writes: >>>>> >>>>>> Am 20.07.26 um 16:27 schrieb Philippe Gerum: >>>>>> >>>>>> An option would be either to support of oob_ioctl() for >>>>>> SIOCGARP. Or create something like >>>>>> evl_net_routeinfo(s, addr) returning flags would make probing obsolete. >>>>>> >>>>> >>>>> Not entirely. The issue with solely having SIOCGARP or any probe-only >>>>> explicit request is that you would have to pair two syscalls at each >>>>> transmit at least, one to probe for the sender address before possibly >>>>> soliciting that peer if absent from the oob cache, another one for >>>>> sending the message eventually. i.e., for every packet: >>>>> >>>>> ioctl(SIOCGARP) >>>>> !ATF_COM? -> evl_net_solicit() >>>>> oob_sendmsg(..., 0) >>>> You are right, that is an unneeded syscall as long as you don't keep >>>> a >>>> list of clients as before. This can remove the need from calling >>>> evl_net_solicit() in the case the client is already in ARP and >>>> permanent but >>>> this will be the only change and won't help that much. >>>> >>>>> >>>>> OTOH, with the latest attempt to address this issue, we can send a >>>>> probe-only request by passing MSG_PROBE (EHOSTUNREACH), or a request >>>>> that does not attempt to defer transmit to the inband stage on probe >>>>> failure by passing MSG_DONTWAIT (EWOULDBLOCK). i.e., for every packet >>>>> >>>>> redo: >>>>> oob_sendmsg(..., MSG_DONTWAIT) >>>>> EWOULDBLOCK? >>>>> oob_sendmsg(..., MSG_PROBE) >>>>> EHOSTUNREACH? >>>>> evl_net_solicit() >>>>> goto redo >>>>> otherwise assume ENOMEM >>>>> otherwise all done >>>>> >>>>> IOW, using a proper combination of MSG_DONTWAIT and MSG_PROBE in the >>>>> right sequence would either succeed to send the packet immediately on >>>>> the first oob_sendmsg() call, otherwise fail on memory shortage or >>>>> missing route from the oob cache. In the latter case, which could only >>>>> happen once for each new peer under normal circumstances, we could >>>>> disambiguate the EWOULDBLOCK status using an explicit probe. >>>>> >>>>> A better way to do this in a single step unambiguously would require the >>>>> addition of another operation flag, like MSG_DONTDEFER, preventing the >>>>> deferral to inband on failed probe and causing oob_sendmsg() to return >>>>> with a specific error code. e.g. something as simple as the following >>>>> would cover all requirements: >>>>> >>>>> oob_sendmsg(..., MSG_DONTDEFER) -> EADDRNOTAVAIL on failed probe. >>>>> >>>>> Now, we might also piggyback off of MSG_OOB instead of defining yet >>>>> another operation flag, as a way to say "oob only, don't relay to >>>>> inband", but I'm still pondering whether this would be nicely witty or >>>>> utterly confusing.. >>>>> >>>> Yes, this is a variant. I was not aware that MSG_DONTWAIT -> >>>> EWOULDBLOCK >>>> can also mean ENOMEM. >>>> Now after considering all options, i start to prefer the variant >>>> before >>>> this patch, keeping a list of already solicit'ed clients. It is straight >>>> forward, simple and fast. And you know exactly when to expect an in band >>>> call. Might be we should just drop this patch instead of adding unnecessary >>>> complexity for example code? >>> >>> BTW: With drop this patch I don't mean the one already in but this one: >>> [PATCH] tidbits: net-udp: use MSG_DONTWAIT for server mode >>> https://lore.kernel.org/xenomai/[email protected]/T/#u >>> >> >> Got it, it may be worth waiting for the dust to settle in the core >> regarding the probing issue before adapting this tidbit anyway. I'm >> going to consolidate the points we have discussed so far, in order to >> come up with an implementation that satisfies all the requirements. > > Here is a new proposal that should cover all the cases we discussed so > far (next/v6.12.y-cip-evl-rebase branch). A new flag is introduced, > namely MSG_STEADY, which tells the core to only accept cache lookups > that deliver permanent ARP records. This flag can be combined with > MSG_PROBE and MSG_DONTWAIT for extended semantics. Meanwhile, a > zero-sized message is still accepted in order to request a mere address > probe without having to pass any meaningful data. This goes like this: > > Function: probe-only > > oob_sendmsg(s, &msghdr, NULL, MSG_PROBE) > -> EADDRNOTAVAIL if no peer address found > > Function: probe-only, permanent peer address required > > oob_sendmsg(s, &msghdr, NULL, MSG_PROBE|MSG_STEADY) > -> EADDRNOTAVAIL if no permanent peer address found > (also upon match of aging ARP record) > > Function: send, no deferral (to inband) allowed > > oob_sendmsg(s, &msghdr, NULL, MSG_DONTWAIT) > -> EADDRNOTAVAIL if no peer address found > -> EWOULDBLOCK on memory shortage > > Function: send, no deferral (to inband) allowed, permanent peer address required > > oob_sendmsg(s, &msghdr, NULL, MSG_DONTWAIT|MSG_STEADY) > -> EADDRNOTAVAIL if no permanent peer address found > (also upon match of aging ARP record) > -> EWOULDBLOCK on memory shortage > > Function: send, permanent peer address required > > oob_sendmsg(s, &msghdr, NULL, MSG_STEADY) > -> EADDRNOTAVAIL if no permanent peer address found > (also upon match of aging ARP record) > Looks promising. This also means after oob_sendmsg(..., MSG_DONTWAIT|MSG_STEADY) no second call oob_sendmsg(..., MSG_PROBE) is needed to handle -ENOMEM right? oob_sendmsg(s, &msghdr, NULL, 0) is the only case with deferral to inband as it looks in udp.c:421...423? if (ret != -EADDRNOTAVAIL || msg_flags & (MSG_PROBE|MSG_DONTWAIT|MSG_STEADY)) return ret; I have to test it and will send an update to the oob_net_udp patch soon. BTW: CC [email protected] got lost in my last email. I added it again.