X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-network%2Fdhcp-server-internal.h;h=58750c441813807a0f44cc42baeed9e6aaf7999c;hb=76f282c636f33b41bdbc93a5b2945945ee0029bf;hp=8191ef7fd78715965e17948722a841d7c6c96141;hpb=ff734080aa02cd70b13bc0fdeec4a5886166163a;p=elogind.git diff --git a/src/libsystemd-network/dhcp-server-internal.h b/src/libsystemd-network/dhcp-server-internal.h index 8191ef7fd..58750c441 100644 --- a/src/libsystemd-network/dhcp-server-internal.h +++ b/src/libsystemd-network/dhcp-server-internal.h @@ -20,13 +20,32 @@ along with systemd; If not, see . ***/ +#pragma once + #include "sd-event.h" #include "sd-dhcp-server.h" +#include "hashmap.h" #include "refcnt.h" #include "util.h" #include "log.h" +#include "dhcp-internal.h" + +typedef struct DHCPClientId { + size_t length; + uint8_t *data; +} DHCPClientId; + +typedef struct DHCPLease { + DHCPClientId client_id; + + be32_t address; + be32_t gateway; + uint8_t chaddr[16]; + usec_t expiration; +} DHCPLease; + struct sd_dhcp_server { RefCount n_ref; @@ -34,9 +53,41 @@ struct sd_dhcp_server { int event_priority; sd_event_source *receive_message; int fd; + int fd_raw; + + int index; + be32_t address; + be32_t netmask; + be32_t pool_start; + size_t pool_size; + size_t next_offer; + + Hashmap *leases_by_client_id; + DHCPLease **bound_leases; }; +typedef struct DHCPRequest { + /* received message */ + DHCPMessage *message; + + /* options */ + DHCPClientId client_id; + size_t max_optlen; + be32_t server_id; + be32_t requested_ip; + int lifetime; +} DHCPRequest; + DEFINE_TRIVIAL_CLEANUP_FUNC(sd_dhcp_server*, sd_dhcp_server_unref); #define _cleanup_dhcp_server_unref_ _cleanup_(sd_dhcp_server_unrefp) -#define log_dhcp_server(client, fmt, ...) log_meta(LOG_DEBUG, __FILE__, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__) +#define log_dhcp_server(client, fmt, ...) log_internal(LOG_DEBUG, 0, __FILE__, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__) + +int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, + size_t length); +int dhcp_server_send_packet(sd_dhcp_server *server, + DHCPRequest *req, DHCPPacket *packet, + int type, size_t optoffset); + +unsigned long client_id_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]); +int client_id_compare_func(const void *_a, const void *_b);