[systemd-devel] [PATCH v2 20/26] dhcp: Handle received DHCP Offer message
Patrik Flykt
Patrik.Flykt at linux.intel.com
Wed Nov 27 07:13:38 PST 2013
Hi,
On Tue, 2013-11-26 at 00:23 +0100, Lennart Poettering wrote:
> On Mon, 25.11.13 09:13, Patrik Flykt (patrik.flykt at linux.intel.com) wrote:
>
> > +static int client_receive_raw_message(sd_event_source *s, int fd,
> > + uint32_t revents, void *userdata)
> > +{
> > + DHCPClient *client = userdata;
> > + int len, buflen;
> > + uint8_t *buf;
> > + uint8_t tmp;
> > + DHCPPacket *message;
> > +
> > + buflen = sizeof(DHCPPacket) + DHCP_CLIENT_MIN_OPTIONS_SIZE;
> > + buf = malloc0(buflen);
> > + if (!buf) {
> > + read(fd, &tmp, 1);
> > + return 0;
> > + }
>
> Hmm, how long is this message? Given that you don't keep the memory
> around, why not just allocate this on the stack? Either with alloca, or
> even directly as an uint8_t array? Given that this seems to be
> relatively short, this should not be an issue and is one error source
> less...
This one would be the minimum IPv4 packet size, 576 bytes. Should I go
with alloca() here?
> > +
> > + len = read(fd, buf, buflen);
> > + if (len < 0)
> > + goto error;
> > +
> > + message = (DHCPPacket *)buf;
> > +
> > + switch (client->state) {
> > + case DHCP_STATE_SELECTING:
> > +
> > + if (client_receive_offer(client, message, len) >= 0) {
> > +
> > + close(client->fd);
> > + client->fd = -1;
> > + client->receive_message =
> > +
> > sd_event_source_unref(client->receive_message);
>
>
> You should unref the source before closing the fd, as this internally
> still references the fd.
Ok.
> > -int dhcp_network_send_raw_packet(int index, void *packet, int len)
> > +int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link,
> > + void *packet, int len)
>
> Hmm, what's the story regarding blocking here? What happens if the
> socket is full? This call will block then, which sucks. Also, if you are
> not using SOCK_NONBLOCK on these sockets, epoll behaviour can be weird,
> as the socket layer takes the freedom to wake you up sometimes without
> any packet to read. (We had the issue in Avahi).
>
> It sounds to me as if you should set SOCK_NONBLOCK and then set a socket
> send buffer (SO_SNDBUF) as large as useful, and simply consider it a
> real error if you the ever get EAGAIN on sending...
I'll fix...
Patrik
More information about the systemd-devel
mailing list