BSD sockets UDP uses 'headers' for all packets
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 5 Jun 2014 20:40:36 +0000 (13:40 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 5 Jun 2014 20:40:36 +0000 (13:40 -0700)
commit79993ed3dab4e7af7e7a3099e35edfd3dd45ebf0
treefcbb8198e87ff71cbbeda4a22a3fa3e5f4d47e81
parent1a7a2a4041d098e7e8b1611276fd45b2d1c381a0
BSD sockets UDP uses 'headers' for all packets

BSD sockets wants to do both:
socket, bind, {sendto,recvfrom}
and
socket, bind, connect, {send,recv}

'headers' mode allows us to blindly sendto and recvfrom.  The last
chance we have to set this is in bind (though it makes more sense to do
so in socket).

We can only announce or connect once.  To be able to receive, we need to
have announced by the end of bind so that our entry is in the hash
table before the application knows which local port we're on.  So we'll
never be able to connect after doing a bind.

Connect still sets the sockets raddr (in the Rock), so all of our
send/recv calls will just go through sendto/recvfrom, and extract the
raddr from the Rock and put it in the 'headers'.

We could consider having calls to connect() clear the headers, and then
connect as normal, but that would require the kernel to let us change
from announced to connected.  I'm not willing to do that yet.

Also, this way, we can connect multiple times, changing the default
remote end, which is what you're supposed to be able to do.  You can't
send multiple connect messages to the kernel.

Note that the Rock code is not threadsafe, and that every send/recv
needs to extract the rock, which is O(number of rocks/fds).
kern/src/net/udp.c
user/bsd/bind.c
user/bsd/connect.c
user/bsd/send.c
user/bsd/sendto.c
user/bsd/socket.c