Subject: Re: strangeness while using SOCK_RAW
To: None <tech-net@netbsd.org>
From: Eric Auge <eau@phear.org>
List: tech-net
Date: 02/09/2007 16:33:01
This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enigECB54ABBD8311697846DA233
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Ignatios Souvatzis wrote:
> Hi Eric,
Hi Ignatios,

First of all, thanks answering :).

> On Thu, Feb 08, 2007 at 03:59:30PM +0100, Eric Auge wrote:
>=20
>> /usr/src/sys/netinet/raw_ip.c :
>> [...]
>> /*
>>  * XXX Compatibility: programs using raw IP expect ip_len
>>  * XXX to have the header length subtracted, and in host order.
>>  * XXX ip_off is also expected to be host order.
>>  */
>>  ip->ip_len =3D ntohs(ip->ip_len) - (ip->ip_hl << 2);
>>  NTOHS(ip->ip_off);
>> [...]
>>
>> I don't understand this behavior and comment.
>>
>> What "programs" using SOCK_RAW, IPPROTO_RAW (the behavior for undefine=
d protos
>> seems to be similar to the IPPROTO_RAW one) expect the RAW IP header
>> len(ip->ip_len) to be substracted from the size of the IP header witho=
ut ripping
>> off the header itself ...?
>=20
> I think I read a comment somewhere (Stevens Vol. 2 ?) that programs get=
=20
> the same environment they would get in the kernel at a some calling poi=
nt.

I don't really understand what you mean here.

ok but why the ip_len field is modified then ? (i guess u speak about SOC=
K_RAW)
if the program should get the same environement they would get in kernel,=
 the
content should NOT be changed on-the-fly by the kernel on the way to user=
land
right ?

> Sounds reasonable - you can test basic stuff, before you start building=

> and booting kernels.

I don't understand.

I was speaking about porting openospfd from openbsd to netbsd (i did, i m=
ade a
quick "change" for the ip_len issue, it works, now I got problems pkgsrc'=
ing it
but that's another story), i see this strange behavior where in raw socke=
ts the
ip header len within the ip header is changed by the kernel on its way to=

userland, then userland application (openospfd) is driven to error becaus=
e of
this, openospfd received 80 bytes of data and check if IP header has the =
same
value, but in NetBSD case it doesn't, recvfrom() says 80 bytes when IP he=
ader
says 60 bytes, then I 'UTSL', I see those previous pasted kernel lines, a=
nd i
ask one simple question, why this behavior/choice ?, I just wish to under=
stand.

To me, it looks like a small issue, what have i missed ?

> For serious work, you'd socket(PF_INET, SOCK_DGRAM, PROTO_OSPF) (and
> write the code to support that in the kernel).

Is that really the path to follow?  would it be useful to netbsd project?=

For such a small port I should do kernel changes ?

Thanks :)
Regards,
Eric.
> Regards,
> 	-is


--------------enigECB54ABBD8311697846DA233
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (NetBSD)

iD8DBQFFzJQwSdZNA80H8MYRAlIwAJ9QaFFNs1psTWiNdoh2jVmi6hLorACfcipj
VlZrrvU5Y/ct7R4+CzKoe60=
=T5Nr
-----END PGP SIGNATURE-----

--------------enigECB54ABBD8311697846DA233--