]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd-network/dhcp-server-internal.h
d69b4870799f0304ec985678d4dcab16911a133a
[thirdparty/systemd.git] / src / libsystemd-network / dhcp-server-internal.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 /***
5 Copyright (C) 2013 Intel Corporation. All rights reserved.
6 Copyright (C) 2014 Tom Gundersen
7 ***/
8
9 #include "sd-dhcp-server.h"
10 #include "sd-event.h"
11
12 #include "dhcp-internal.h"
13 #include "hashmap.h"
14 #include "log.h"
15 #include "util.h"
16
17 typedef struct DHCPClientId {
18 size_t length;
19 void *data;
20 } DHCPClientId;
21
22 typedef struct DHCPLease {
23 DHCPClientId client_id;
24
25 be32_t address;
26 be32_t gateway;
27 uint8_t chaddr[16];
28 usec_t expiration;
29 } DHCPLease;
30
31 struct sd_dhcp_server {
32 unsigned n_ref;
33
34 sd_event *event;
35 int event_priority;
36 sd_event_source *receive_message;
37 int fd;
38 int fd_raw;
39
40 int ifindex;
41 be32_t address;
42 be32_t netmask;
43 be32_t subnet;
44 uint32_t pool_offset;
45 uint32_t pool_size;
46
47 char *timezone;
48
49 struct in_addr *ntp, *dns;
50 unsigned n_ntp, n_dns;
51
52 bool emit_router;
53
54 Hashmap *leases_by_client_id;
55 DHCPLease **bound_leases;
56 DHCPLease invalid_lease;
57
58 uint32_t max_lease_time, default_lease_time;
59 };
60
61 typedef struct DHCPRequest {
62 /* received message */
63 DHCPMessage *message;
64
65 /* options */
66 DHCPClientId client_id;
67 size_t max_optlen;
68 be32_t server_id;
69 be32_t requested_ip;
70 uint32_t lifetime;
71 } DHCPRequest;
72
73 #define log_dhcp_server(client, fmt, ...) log_internal(LOG_DEBUG, 0, __FILE__, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__)
74 #define log_dhcp_server_errno(client, error, fmt, ...) log_internal(LOG_DEBUG, error, __FILE__, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__)
75
76 int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message,
77 size_t length);
78 int dhcp_server_send_packet(sd_dhcp_server *server,
79 DHCPRequest *req, DHCPPacket *packet,
80 int type, size_t optoffset);
81
82 void client_id_hash_func(const void *p, struct siphash *state);
83 int client_id_compare_func(const void *_a, const void *_b);