Subject: Re: packet handling for IPsec NAT-T
To: Emmanuel Dreyfus <manu@netbsd.org>
From: mouss <usebsd@free.fr>
List: tech-kern
Date: 09/24/2004 21:02:53
Emmanuel Dreyfus wrote:
> Hi
>
> I'm still working on IPsec NAT-T. It works by encapsulating ESP packets in
> UDP. When it receives an UDP packet on a socket that has already been flagged
> as ESP over UDP capable, the kernel must remove the UDP header and give
> the ESP packet to the ESP input function.
>
> I have a hook in udp4_realinput that does this (m if the mbuf, off is the
> offset of the UDP payload, as off in udp4_realinput())
>
> len = m->m_len - off;
> data = m->m_data + off;
> remove = sizeof(struct udphdr);
>
> memmove(&m->m_data[off - remove], &m->m_data[off], len - remove);
m_adj() would be enough, no?
but I don't see why you need this anyway. Isn't
skip = off + sizeof(struct udphdr);
esp4_input(m, skip);
supposed to do it all?
My understanding is that after the udp header comes a "normal" and
correct esp packet, so you don't need to touch its ip_len and ip_p, and
you just need to skip the udp header. Or am I missing something?
BTW What if you get a UDP packet to the same port, but which is not an
encapsulated ESP packet? Is this considered an error? I guess it is an
error, as it seems hard to manage both cases with a single socket.
> ip = (struct ip *)m->m_data;
> ip->ip_len = htons(ntohs(ip->ip_len) - remove);
> ip->ip_p = IPPROTO_ESP;
>
> m->m_len -= remove;
> m->m_pkthdr.len -= remove;
> esp4_input(m, off - remove);
>
> If there anything wrong there? I'm not sure I'm doing the right thing with
> the mbuf.
>