> On Jan 30, 2026, at 7:27 AM, Rick Macklem <[email protected]> wrote:
> 
> On Tue, Jan 27, 2026 at 7:00 PM Zhenlei Huang <[email protected] 
> <mailto:[email protected]>> wrote:
>> 
>> 
>> 
>>> On Jan 28, 2026, at 8:03 AM, Rick Macklem <[email protected]> wrote:
>>> 
>>> Hi,
>>> 
>>> Basically, the subject line says it all.
>>> 
>>> I am wondering if the NFS/krpc code (send side) can
>>> determine what NIC will be used to send the RPC message.
>>> 
>>> Why?
>>> 
>>> Right now, the NFS code fills the RPC message into
>>> M_EXTPG mbufs for the KTLS case only.
>>> However, some NICs (Chelsio and Mellanox?) can
>>> handle M_EXTPG mbufs, as indicated by the
>>> IFCAP_MEXTPG flag being set.
>>> 
>>> As such, it would be nice if the NFS/krpc code could
>>> determine if IFCAP_MEXTPG is set, so that it can
>>> use M_EXTPG mbufs.
>>> --> Yes, for other NICs, the mbuf chain will be copied
>>>     in ip_output() by calling mb_unmapped_to_ext(),
>>>     so they work, but I don't see any reason to fill the
>>>     RPC message into M_EXTPG mbufs if ip_output()
>>>     just ends up copying them?
>>> 
>>> The NFS/krpc code does know the IP host address of the
>>> other end, so I think the question becomes "can the NFS/krpc
>>> code do a routing call to find out what NIC will be used?".
>> 
>> Given the dest IP address is known, you can find the nexthop
>> info from fib4_lookup() and then extract the ifnet from the nexthop
>> info. The usage of fib4_lookup() in ip_output() is a good example.
> Thanks! It seems to work for a simple test case.
> 
> However, I do have a couple of questions.
> My test uses so_fibnum and inp_flowid. Are these the correct place
> to get these arguments, when done on a TCP socket just after a connect?

I think yes.

> 
> And for IPv6, I assume I use fib6_lookup()?

Yes.

> --> My question is, do I first call in6_splitscope() to get the correct 
> address
>     argument and scopeid? (I know nothing about IPv6;-)
>     (I don't even know if the destination address for an NFS connection will
>      have a scopeid?)

For the scopeid, it is required for IPv6 link-local address. So if the 
destination address for an NFS connection is
link-local address, then yes in6_splitscope() should be called to get correct 
scopeid. PS, currently the
scopeid is embedded into `struct in6_addr` and re-use some high bits.

> 
> Thanks for your help, rick

You're welcome !

> 
>> 
>>> 
>>> Thanks for any info, rick
>>> 
>>> Thanks for any info, rick
>>> 
>> 
>> Best regards,
>> Zhenlei

Best regards,
Zhenlei

Reply via email to