diff --git a/src/libsystemd-network/dhcp-server-internal.h b/src/libsystemd-network/dhcp-server-internal.h index 8b5620e1383..f2ffb39e440 100644 --- a/src/libsystemd-network/dhcp-server-internal.h +++ b/src/libsystemd-network/dhcp-server-internal.h @@ -86,6 +86,7 @@ typedef struct DHCPRequest { } DHCPRequest; #define log_dhcp_server(client, fmt, ...) log_internal(LOG_DEBUG, 0, __FILE__, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__) +#define log_dhcp_server_errno(client, error, fmt, ...) log_internal(LOG_DEBUG, error, __FILE__, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__) int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, size_t length); diff --git a/src/libsystemd-network/sd-dhcp-server.c b/src/libsystemd-network/sd-dhcp-server.c index d64a47d2fce..25f5b378bc4 100644 --- a/src/libsystemd-network/sd-dhcp-server.c +++ b/src/libsystemd-network/sd-dhcp-server.c @@ -313,7 +313,6 @@ static int dhcp_server_send_udp(sd_dhcp_server *server, be32_t destination, }; struct cmsghdr *cmsg; struct in_pktinfo *pktinfo; - int r; assert(server); assert(server->fd >= 0); @@ -337,8 +336,7 @@ static int dhcp_server_send_udp(sd_dhcp_server *server, be32_t destination, pktinfo->ipi_ifindex = server->ifindex; pktinfo->ipi_spec_dst.s_addr = server->address; - r = sendmsg(server->fd, &msg, 0); - if (r < 0) + if (sendmsg(server->fd, &msg, 0) < 0) return -errno; return 0; @@ -778,8 +776,9 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, if (!server->bound_leases[next_offer]) { address = server->subnet | htobe32(server->pool_offset + next_offer); break; - } else - next_offer = (next_offer + 1) % server->pool_size; + } + + next_offer = (next_offer + 1) % server->pool_size; } } @@ -788,18 +787,12 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, return 0; r = server_send_offer(server, req, address); - if (r < 0) { + if (r < 0) /* this only fails on critical errors */ - log_dhcp_server(server, "could not send offer: %s", - strerror(-r)); - return r; - } else { - log_dhcp_server(server, "OFFER (0x%x)", - be32toh(req->message->xid)); - return DHCP_OFFER; - } + return log_dhcp_server_errno(server, r, "Could not send offer: %m"); - break; + log_dhcp_server(server, "OFFER (0x%x)", be32toh(req->message->xid)); + return DHCP_OFFER; } case DHCP_DECLINE: log_dhcp_server(server, "DECLINE (0x%x): %s", be32toh(req->message->xid), strna(error_message)); @@ -899,8 +892,7 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, r = server_send_ack(server, req, address); if (r < 0) { /* this only fails on critical errors */ - log_dhcp_server(server, "could not send ack: %s", - strerror(-r)); + log_dhcp_server_errno(server, r, "Could not send ack: %m"); if (!existing_lease) dhcp_lease_free(lease); @@ -916,18 +908,15 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, return DHCP_ACK; } + } else if (init_reboot) { r = server_send_nak(server, req); - if (r < 0) { + if (r < 0) /* this only fails on critical errors */ - log_dhcp_server(server, "could not send nak: %s", - strerror(-r)); - return r; - } else { - log_dhcp_server(server, "NAK (0x%x)", - be32toh(req->message->xid)); - return DHCP_NAK; - } + return log_dhcp_server_errno(server, r, "Could not send nak: %m"); + + log_dhcp_server(server, "NAK (0x%x)", be32toh(req->message->xid)); + return DHCP_NAK; } break; @@ -953,12 +942,10 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, server->bound_leases[pool_offset] = NULL; hashmap_remove(server->leases_by_client_id, existing_lease); dhcp_lease_free(existing_lease); + } - return 1; - } else - return 0; - } - } + return 0; + }} return 0; } @@ -977,6 +964,7 @@ static int server_receive_message(sd_event_source *s, int fd, }; struct cmsghdr *cmsg; ssize_t buflen, len; + int r; assert(server); @@ -997,7 +985,8 @@ static int server_receive_message(sd_event_source *s, int fd, return 0; return -errno; - } else if ((size_t)len < sizeof(DHCPMessage)) + } + if ((size_t)len < sizeof(DHCPMessage)) return 0; CMSG_FOREACH(cmsg, &msg) { @@ -1015,7 +1004,11 @@ static int server_receive_message(sd_event_source *s, int fd, } } - return dhcp_server_handle_message(server, message, (size_t)len); + r = dhcp_server_handle_message(server, message, (size_t) len); + if (r < 0) + log_dhcp_server_errno(server, r, "Couldn't process incoming message: %m"); + + return 0; } int sd_dhcp_server_start(sd_dhcp_server *server) { @@ -1024,8 +1017,8 @@ int sd_dhcp_server_start(sd_dhcp_server *server) { assert_return(server, -EINVAL); assert_return(server->event, -EINVAL); assert_return(!server->receive_message, -EBUSY); - assert_return(server->fd_raw == -1, -EBUSY); - assert_return(server->fd == -1, -EBUSY); + assert_return(server->fd_raw < 0, -EBUSY); + assert_return(server->fd < 0, -EBUSY); assert_return(server->address != htobe32(INADDR_ANY), -EUNATCH); r = socket(AF_PACKET, SOCK_DGRAM | SOCK_NONBLOCK, 0); @@ -1081,8 +1074,8 @@ int sd_dhcp_server_forcerenew(sd_dhcp_server *server) { lease->chaddr); if (r < 0) return r; - else - log_dhcp_server(server, "FORCERENEW"); + + log_dhcp_server(server, "FORCERENEW"); } return r;