Thinking about UDP and tunneling

Julian Elischer julian at elischer.org
Wed Nov 19 12:50:14 PST 2008


Randall Stewart wrote:
> 
> On Nov 19, 2008, at 1:45 PM, Julian Elischer wrote:
> 
>> Randall Stewart wrote:
>>> Dear All:
>>> I have been contemplating UDP and tunneling. One of the
>>> things that is a nice feature in MacOS is the ability of
>>> a kernel module/extension to open a kernel level socket
>>> and have the mbuf chain that arrives for that port be passed
>>> in via a function.
>>
>> define "kernel level" and "mbuf chain that arrives [...] passed in via 
>> a function"
>>
>>
>>
>>> We use this in our MacOS version of the SCTP stack to do the
>>> UDP de-tunneling of SCTP packets. This is becoming a more and
>>> more common thing i.e. having transport protocols like SCTP and DCCP
>>> be tunneled over UDP to get by NAT's.... this actually sucks that
>>> this is necessary .. but it is what it is....
>>
>> I do that using netgraph..
>> set a point ot point ng_iface and hook the other end to
>> a netgraph ksocket which is bound/connaected where you want.
>>
>> "just works"
>>
>>> So, I am contemplating adding a similar sort of feature... basically
>>> provide an interface in UDP that a consumer (such as SCTP or DCCP) could
>>> use to "bind" a port and get UDP packets directly.
>>> What do you all think of the idea?
>>
>> Well netgraph allows you to do it already
> 
> 
> Not sure what netgraph does... what is wanted is this in comes
> 
> 
> +-----+
> | IP  |
> +-----+
> | UDP |
> +-----+
> | Oth |
> | tra |
> | por |
> | t h |
> | ead |
> | er  |
> | and |
> | dat |
> | a.  |
> +-----+


Othtra port header and data.?


> 
> 
> Ideally it runs into UDP via ip_input()
> and comes down to where it would append() to the socket.

At this point, netgraph grabs it and passes the mbufs wherever you 
tell it to pass them.

> 
> What you want in this case is the whole mbuf chain to be sent
> to the transport_udp_input(m, offset) function

cd /sys
root at trafmon1:grep transport_udp_input net*/*
root at trafmon1:grep transport_udp_input net*/*/*



> 
> This changes the above to
> +-----+
> | IP  |
> +-----+
> | Oth |
> | tra |
> | por |
> | t h |
> | ead |
> | er  |
> | and |
> | dat |
> | a.  |
> +-----+


where does the new IP header information come from?

> 
> And sends it into the transport_input() (same one called by ip_input).
> 
> This then makes a clean and easy way to have "tunneled UDP" transport 
> protocols
> work in kernel. The input side looks the same. Output is pretty easy.. 
> easy to
> drop a UDP header in out output...
> 
> 
> Netgraph would have to be watching every UDP packet always..

just those that go to that ksocket.  we hook on at the socketbuf point.

> 
> seems to me easier to bind a kernel level socket with some option
> to call an input function....
> 
> R
> 
> 
> 
>>
>>
>>> That also reminds me.. who owns the ipfw code.. we actually
>>> have SCTP nat support that Jason But has done that we need to
>>> get in...
>>> I would be more than glad to shepherd this in if the owner
>>> of the code does not have the time...
>>> R
>>> ------------------------------
>>> Randall Stewart
>>> 803-317-4952 (cell)
>>> 803-345-0391(direct)
>>> _______________________________________________
>>> freebsd-net at freebsd.org mailing list
>>> http://lists.freebsd.org/mailman/listinfo/freebsd-net
>>> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
>>
>> _______________________________________________
>> freebsd-net at freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-net
>> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
>>
> 
> ------------------------------
> Randall Stewart
> 803-317-4952 (cell)
> 803-345-0391(direct)



More information about the freebsd-net mailing list