Squashed 'src/n-dhcp4/' changes from 281f431756e3..64513e31c01a

64513e31c01a connection: dynamically allocate the receive buffer
2b55ae2f0bda merge branch 'bengal:lease-boot-file'
d0f13d174b1a lease: add an accessor for the file name
0c64aedd80bf lease: fix n_dhcp4_client_lease_get_server_identifier()
745ca63afb44 lease: fix typo
b9d907d32ec0 Make n_dhcp4_client_lease_get_basetime publicly visible

git-subtree-dir: src/n-dhcp4
git-subtree-split: 64513e31c01a88db54c89321f89bcc85da27ffc5
This commit is contained in:
Thomas Haller 2022-04-13 10:57:10 +02:00
parent b6bd5bb7c5
commit aba56902d1
6 changed files with 58 additions and 20 deletions

View file

@ -35,8 +35,10 @@ global:
n_dhcp4_client_lease_unref;
n_dhcp4_client_lease_get_yiaddr;
n_dhcp4_client_lease_get_siaddr;
n_dhcp4_client_lease_get_basetime;
n_dhcp4_client_lease_get_lifetime;
n_dhcp4_client_lease_get_server_identifier;
n_dhcp4_client_lease_get_file;
n_dhcp4_client_lease_query;
n_dhcp4_client_lease_select;
n_dhcp4_client_lease_accept;

View file

@ -1146,16 +1146,21 @@ int n_dhcp4_c_connection_dispatch_timer(NDhcp4CConnection *connection,
int n_dhcp4_c_connection_dispatch_io(NDhcp4CConnection *connection,
NDhcp4Incoming **messagep) {
_c_cleanup_(n_dhcp4_incoming_freep) NDhcp4Incoming *message = NULL;
_c_cleanup_(c_freep) uint8_t *buffer = NULL;
char serv_addr[INET_ADDRSTRLEN];
char client_addr[INET_ADDRSTRLEN];
uint8_t type = 0;
int r;
buffer = malloc(UINT16_MAX);
if (!buffer)
return -ENOMEM;
switch (connection->state) {
case N_DHCP4_C_CONNECTION_STATE_PACKET:
r = n_dhcp4_c_socket_packet_recv(connection->fd_packet,
connection->scratch_buffer,
sizeof(connection->scratch_buffer),
buffer,
UINT16_MAX,
&message);
if (!r)
break;
@ -1164,8 +1169,8 @@ int n_dhcp4_c_connection_dispatch_io(NDhcp4CConnection *connection,
return N_DHCP4_E_AGAIN;
case N_DHCP4_C_CONNECTION_STATE_DRAINING:
r = n_dhcp4_c_socket_packet_recv(connection->fd_packet,
connection->scratch_buffer,
sizeof(connection->scratch_buffer),
buffer,
UINT16_MAX,
&message);
if (!r)
break;
@ -1187,8 +1192,8 @@ int n_dhcp4_c_connection_dispatch_io(NDhcp4CConnection *connection,
/* fall-through */
case N_DHCP4_C_CONNECTION_STATE_UDP:
r = n_dhcp4_c_socket_udp_recv(connection->fd_udp,
connection->scratch_buffer,
sizeof(connection->scratch_buffer),
buffer,
UINT16_MAX,
&message);
if (!r)
break;

View file

@ -249,9 +249,11 @@ _c_public_ void n_dhcp4_client_lease_get_lifetime(NDhcp4ClientLease *lease, uint
* Gets the address contained in the server-identifier DHCP option, in network
* byte order.
*
* Return: 0 on success, negative error code on failure.
* Return: 0 on success,
* N_DHCP4_E_UNSET if the lease doesn't contain a server-identifier, or
* N_DHCP4_E_INTERNAL if the server-identifier is not valid.
*/
_c_public_ int n_dhcp4_client_lease_get_server_identifier (NDhcp4ClientLease *lease, struct in_addr *addr) {
_c_public_ int n_dhcp4_client_lease_get_server_identifier(NDhcp4ClientLease *lease, struct in_addr *addr) {
uint8_t *data;
size_t n_data;
int r;
@ -260,13 +262,49 @@ _c_public_ int n_dhcp4_client_lease_get_server_identifier (NDhcp4ClientLease *le
if (r)
return r;
if (n_data < sizeof(struct in_addr))
return N_DHCP4_E_MALFORMED;
return N_DHCP4_E_INTERNAL;
memcpy(addr, data, sizeof(struct in_addr));
return 0;
}
/**
* n_dhcp4_client_lease_get_file() - query the lease for the boot file name
* @lease: the lease to operate on
* @file: return argument for the file name
*
* Query the lease for the boot file name from the DHCP header. The file name
* is returned as a NULL-terminated string.
*
* Return: 0 on success,
* N_DHCP4_E_UNSET if the lease does not contain a file name, or
* N_DHCP4_E_INTERNAL if the file name is invalid.
*/
_c_public_ int n_dhcp4_client_lease_get_file(NDhcp4ClientLease *lease, const char **file) {
NDhcp4Message *message;
if (lease->message->options[N_DHCP4_OPTION_OVERLOAD].size > 0
&& ((*lease->message->options[N_DHCP4_OPTION_OVERLOAD].value) & N_DHCP4_OVERLOAD_FILE)) {
/* The field is overloaded to contain other options */
return N_DHCP4_E_UNSET;
}
message = &lease->message->message;
if (message->file[0] == '\0')
return N_DHCP4_E_UNSET;
if (!memchr(message->file, '\0', sizeof(message->file))) {
/* The field is NULL-terminated (RFC 2131 section 2) */
return N_DHCP4_E_INTERNAL;
}
*file = (const char *) message->file;
return 0;
}
/**
* n_dhcp4_client_lease_query() - query the lease for an option
* @lease: the lease to operate on
@ -278,7 +316,7 @@ _c_public_ int n_dhcp4_client_lease_get_server_identifier (NDhcp4ClientLease *le
* be queried, and only options that were explicitly requested can be queried.
*
* Return: 0 on success,
* N_DCHP4_E_INTERNAL if an invalid option is queried,
* N_DHCP4_E_INTERNAL if an invalid option is queried,
* N_DHCP4_E_UNSET if the lease did not contain the option, or
* a negative error code on failure.
*/

View file

@ -333,15 +333,6 @@ struct NDhcp4CConnection {
uint32_t client_ip; /* client IP address, or 0 */
uint32_t server_ip; /* server IP address, or 0 */
uint16_t mtu; /* client mtu, or 0 */
/*
* When we get DHCP packets from the kernel, we need a buffer to read
* the data into. Since UDP packets can be up to 2^16 bytes in size, we
* avoid placing it on the stack and instead read into this scratch
* buffer. It is purely meant as stack replacement, no data is returned
* through this buffer.
*/
uint8_t scratch_buffer[UINT16_MAX];
};
#define N_DHCP4_C_CONNECTION_NULL(_x) { \

View file

@ -171,7 +171,8 @@ void n_dhcp4_client_lease_get_siaddr(NDhcp4ClientLease *lease, struct in_addr *s
void n_dhcp4_client_lease_get_basetime(NDhcp4ClientLease *lease, uint64_t *ns_basetimep);
void n_dhcp4_client_lease_get_lifetime(NDhcp4ClientLease *lease, uint64_t *ns_lifetimep);
int n_dhcp4_client_lease_query(NDhcp4ClientLease *lease, uint8_t option, uint8_t **datap, size_t *n_datap);
int n_dhcp4_client_lease_get_server_identifier (NDhcp4ClientLease *lease, struct in_addr *addr);
int n_dhcp4_client_lease_get_server_identifier(NDhcp4ClientLease *lease, struct in_addr *addr);
int n_dhcp4_client_lease_get_file(NDhcp4ClientLease *lease, const char **file);
int n_dhcp4_client_lease_select(NDhcp4ClientLease *lease);
int n_dhcp4_client_lease_accept(NDhcp4ClientLease *lease);

View file

@ -107,6 +107,7 @@ static void test_api_functions(void) {
(void *)n_dhcp4_client_lease_get_siaddr,
(void *)n_dhcp4_client_lease_get_lifetime,
(void *)n_dhcp4_client_lease_get_server_identifier,
(void *)n_dhcp4_client_lease_get_file,
(void *)n_dhcp4_client_lease_query,
(void *)n_dhcp4_client_lease_select,
(void *)n_dhcp4_client_lease_accept,