summaryrefslogtreecommitdiff
path: root/accel-pppd/ctrl/ipoe/dhcpv4.h
blob: 15db8ed59779707c97fce7383ac30c7cb86b83ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#ifndef __DHCPV4_H
#define __DHCPV4_H

#include <stdint.h>
#include <pthread.h>
#include <endian.h>
#include "list.h"

#include "triton.h"

#define __packed __attribute__((packed))

#define DHCP_SERV_PORT 67
#define DHCP_CLIENT_PORT 68
#define DHCP_MAGIC "\x63\x82\x53\x63"

#define DHCP_OP_REQUEST 1
#define DHCP_OP_REPLY   2

#if __BYTE_ORDER == __LITTLE_ENDIAN
#define DHCP_F_BROADCAST 0x0080
#else
#define DHCP_F_BROADCAST 0x8000
#endif

#define DHCPDISCOVER 1
#define DHCPOFFER    2
#define DHCPREQUEST  3
#define DHCPDECLINE  4
#define DHCPACK      5
#define DHCPNAK      6
#define DHCPRELEASE  7
#define DHCPINFORM   8

struct dhcpv4_hdr {
	uint8_t op;
	uint8_t htype;
	uint8_t hlen;
	uint8_t hops;
	uint32_t xid;
	uint16_t sec;
	uint16_t flags;
	uint32_t ciaddr;
	uint32_t yiaddr;
	uint32_t siaddr;
	uint32_t giaddr;
	uint8_t chaddr[16];
	char sname[64];
	char file[128];
	uint8_t magic[4];
} __packed;

struct dhcpv4_option {
	struct list_head entry;
	uint8_t type;
	uint8_t len;
	uint8_t *data;
};

struct dhcpv4_packet {
	struct dhcpv4_hdr *hdr;
	struct list_head options;
	struct dhcpv4_option *client_id;
	struct dhcpv4_option *relay_agent;
	uint32_t request_ip;
	uint32_t server_id;
	int msg_type;
	in_addr_t src_addr;
	int volatile refs;
	uint8_t *ptr;
	uint8_t data[0];
};

struct dhcpv4_iprange {
	struct list_head entry;
	uint32_t routerip;
	uint32_t startip;
	int mask;
	int pos;
	int len;
	pthread_mutex_t lock;
	unsigned long free[0];
}; 

struct dhcpv4_serv {
	struct triton_context_t *ctx;
	struct triton_md_handler_t hnd;
	uint8_t hwaddr[6];
	int ifindex;
	void (*recv)(struct dhcpv4_serv *serv, struct dhcpv4_packet *pack);
	struct dhcpv4_iprange *range;
};

struct dhcpv4_relay {
	struct list_head entry;
	struct triton_context_t ctx;
	struct triton_md_handler_t hnd;
	struct list_head ctx_list;
	in_addr_t addr;
	in_addr_t giaddr;
};

struct ap_session;

struct dhcpv4_serv *dhcpv4_create(struct triton_context_t *ctx, const char *ifname, const char *opt);
void dhcpv4_free(struct dhcpv4_serv *);

struct dhcpv4_relay *dhcpv4_relay_create(const char *addr, in_addr_t giaddr, struct triton_context_t *ctx, triton_event_func recv);
void dhcpv4_relay_free(struct dhcpv4_relay *, struct triton_context_t *);
int dhcpv4_relay_send(struct dhcpv4_relay *relay, struct dhcpv4_packet *request, uint32_t server_id,
	const char *agent_circuit_id, const char *agent_remote_id);
int dhcpv4_relay_send_release(struct dhcpv4_relay *relay, uint8_t *chaddr, uint32_t xid, uint32_t ciaddr,
	struct dhcpv4_option *client_id, struct dhcpv4_option *relay_agent,
	const char *agent_circuit_id, const char *agent_remote_id);

int dhcpv4_send_reply(int msg_type, struct dhcpv4_serv *serv, struct dhcpv4_packet *req, uint32_t yiaddr, uint32_t siaddr, uint32_t router, uint32_t mask, int lease_time, struct dhcpv4_packet *relay_reply);
int dhcpv4_send_nak(struct dhcpv4_serv *serv, struct dhcpv4_packet *req);

void dhcpv4_packet_ref(struct dhcpv4_packet *pack);
struct dhcpv4_option *dhcpv4_packet_find_opt(struct dhcpv4_packet *pack, int type);
int dhcpv4_packet_insert_opt82(struct dhcpv4_packet *pack, const char *agent_circuit_id, const char *agent_remote_id);
void dhcpv4_packet_free(struct dhcpv4_packet *pack);

int dhcpv4_check_options(struct dhcpv4_packet *);
void dhcpv4_print_options(struct dhcpv4_packet *, void (*)(const char *, ...));

void dhcpv4_print_packet(struct dhcpv4_packet *pack, int relay, void (*print)(const char *fmt, ...));

int dhcpv4_parse_opt82(struct dhcpv4_option *opt, uint8_t **agent_circuit_id, uint8_t **agent_remote_id);

int dhcpv4_get_ip(struct dhcpv4_serv *serv, uint32_t *yiaddr, uint32_t *siaddr, int *mask);
void dhcpv4_put_ip(struct dhcpv4_serv *serv, uint32_t ip);
void dhcpv4_reserve_ip(struct dhcpv4_serv *serv, uint32_t ip);

#endif