Mercurial > hg > toybox
annotate toys/pending/dhcpd.c @ 1593:f2cac60ab2d3 draft
Switching on fortify was not kind to the pending directory. Fix the actual build break (open(O_CREAT) without permissions).
author | Rob Landley <rob@landley.net> |
---|---|
date | Tue, 02 Dec 2014 03:12:58 -0600 |
parents | 6a06541c090c |
children | 41efba077b75 |
rev | line source |
---|---|
1005
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* dhcpd.c - DHCP server for dynamic network configuration. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * Copyright 2013 Madhur Verma <mad.flexi@gmail.com> |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * Copyright 2013 Kyungwan Han <asura321@gamil.com> |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 * No Standard |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 USE_DHCPD(NEWTOY(dhcpd, ">1P#<0>65535=67fS", TOYFLAG_SBIN|TOYFLAG_ROOTONLY)) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 config DHCPD |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 bool "dhcpd" |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 default n |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 help |
1265
0ecfaa7022e8
usage: is lower case (the help generator looks for that, might as well be consistent).
Rob Landley <rob@landley.net>
parents:
1104
diff
changeset
|
13 usage: dhcpd [-fS] [-P N] [CONFFILE] |
1005
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 -f Run in foreground |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 -S Log to syslog too |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 -P N Use port N (default 67) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 config DEBUG_DHCP |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 bool "debugging messeges ON/OFF" |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 default n |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 depends on DHCPD |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 */ |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 #define FOR_dhcpd |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 #include "toys.h" |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 #include <linux/sockios.h> |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 #include <linux/if_ether.h> |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 // Todo: headers not in posix |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 #include <netinet/ip.h> |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 #include <netinet/udp.h> |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 #include <netpacket/packet.h> |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 #if CFG_DEBUG_DHCP==1 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 # define dbg(fmt, arg...) printf(fmt, ##arg) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 #else |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 # define dbg(fmt, arg...) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 #endif |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 #define flag_get(f,v,d) ((toys.optflags & (f)) ? (v) : (d)) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 #define flag_chk(f) ((toys.optflags & (f)) ? 1 : 0) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 #define LOG_SILENT 0x0 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 #define LOG_CONSOLE 0x1 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 #define LOG_SYSTEM 0x2 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 #define DHCP_MAGIC 0x63825363 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 #define DHCPDISCOVER 1 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 #define DHCPOFFER 2 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 #define DHCPREQUEST 3 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 #define DHCPDECLINE 4 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 #define DHCPACK 5 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 #define DHCPNAK 6 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 #define DHCPRELEASE 7 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 #define DHCPINFORM 8 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 #define DHCP_NUM8 (1<<8) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 #define DHCP_NUM16 (1<<9) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 #define DHCP_NUM32 DHCP_NUM16 | DHCP_NUM8 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 #define DHCP_STRING (1<<10) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 #define DHCP_STRLST (1<<11) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 #define DHCP_IP (1<<12) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 #define DHCP_IPLIST (1<<13) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 #define DHCP_IPPLST (1<<14) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 #define DHCP_STCRTS (1<<15) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 // DHCP option codes (partial list). See RFC 2132 and |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 #define DHCP_OPT_PADDING 0x00 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 #define DHCP_OPT_HOST_NAME DHCP_STRING | 0x0c // either client informs server or server gives name to client |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 #define DHCP_OPT_REQUESTED_IP DHCP_IP | 0x32 // sent by client if specific IP is wanted |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 #define DHCP_OPT_LEASE_TIME DHCP_NUM32 | 0x33 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 #define DHCP_OPT_OPTION_OVERLOAD 0x34 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 #define DHCP_OPT_MESSAGE_TYPE DHCP_NUM8 | 0x35 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 #define DHCP_OPT_SERVER_ID DHCP_IP | 0x36 // by default server's IP |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 #define DHCP_OPT_PARAM_REQ DHCP_STRING | 0x37 // list of options client wants |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 #define DHCP_OPT_END 0xff |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 GLOBALS( |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 long port; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 ); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 typedef struct __attribute__((packed)) dhcp_msg_s { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 uint8_t op; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 uint8_t htype; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 uint8_t hlen; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 uint8_t hops; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 uint32_t xid; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 uint16_t secs; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 uint16_t flags; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 uint32_t ciaddr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 uint32_t yiaddr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 uint32_t nsiaddr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 uint32_t ngiaddr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 uint8_t chaddr[16]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 uint8_t sname[64]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 uint8_t file[128]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 uint32_t cookie; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 uint8_t options[308]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 } dhcp_msg_t; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 typedef struct __attribute__((packed)) dhcp_raw_s { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 struct iphdr iph; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 struct udphdr udph; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 dhcp_msg_t dhcp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 } dhcp_raw_t; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 typedef struct static_lease_s { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 struct static_lease_s *next; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 uint32_t nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 int mac[6]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 } static_lease; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 typedef struct { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 uint32_t expires; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 uint32_t lease_nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 uint8_t lease_mac[6]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 char hostname[20]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 uint8_t pad[2]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 } dyn_lease; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 typedef struct option_val_s { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 char *key; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 uint16_t code; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 void *val; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 size_t len; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 } option_val_t; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 typedef struct __attribute__((__may_alias__)) server_config_s { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 char *interface; // interface to use |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 int ifindex; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 uint32_t server_nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 uint32_t port; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 uint8_t server_mac[6]; // our MAC address (used only for ARP probing) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 void *options[256]; // list of DHCP options loaded from the config file |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 /* start,end are in host order: we need to compare start <= ip <= end*/ |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 uint32_t start_ip; // start address of leases, in host order |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
140 uint32_t end_ip; // end of leases, in host order |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 uint32_t max_lease_sec; // maximum lease time (host order) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 uint32_t min_lease_sec; // minimum lease time a client can request |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 uint32_t max_leases; // maximum number of leases (including reserved addresses) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 uint32_t auto_time; // how long should dhcpd wait before writing a config file. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 // if this is zero, it will only write one on SIGUSR1 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 uint32_t decline_time; // how long an address is reserved if a client returns a |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 // decline message |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 uint32_t conflict_time; // how long an arp conflict offender is leased for |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
149 uint32_t offer_time; // how long an offered address is reserved |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
150 uint32_t siaddr_nip; // "next server" bootp option |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
151 char *lease_file; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 char *pidfile; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 char *notify_file; // what to run whenever leases are written |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
154 char *sname; // bootp server name |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
155 char *boot_file; // bootp boot file option |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 struct static_lease *static_leases; // List of ip/mac pairs to assign static leases |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 } server_config_t; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 typedef struct __attribute__((__may_alias__)) server_state_s { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 uint8_t rqcode; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
161 int listensock; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
162 dhcp_msg_t rcvd_pkt; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 uint8_t* rqopt; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 dhcp_msg_t send_pkt; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 static_lease *sleases; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 struct arg_list *dleases; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 } server_state_t; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
168 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 struct config_keyword { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 char *keyword; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 int (*handler)(const char *str, void *var); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 void *var; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 char *def; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
174 }; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 static option_val_t options_list[] = { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 {"lease" , DHCP_NUM32 | 0x33, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 {"subnet" , DHCP_IP | 0x01, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 {"broadcast" , DHCP_IP | 0x1c, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 {"router" , DHCP_IP | 0x03, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 {"ipttl" , DHCP_NUM8 | 0x17, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 {"mtu" , DHCP_NUM16 | 0x1a, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 {"hostname" , DHCP_STRING | 0x0c, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 {"domain" , DHCP_STRING | 0x0f, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 {"search" , DHCP_STRLST | 0x77, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 {"nisdomain" , DHCP_STRING | 0x28, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 {"timezone" , DHCP_NUM32 | 0x02, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 {"tftp" , DHCP_STRING | 0x42, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 {"bootfile" , DHCP_STRING | 0x43, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 {"bootsize" , DHCP_NUM16 | 0x0d, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 {"rootpath" , DHCP_STRING | 0x11, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 {"wpad" , DHCP_STRING | 0xfc, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 {"serverid" , DHCP_IP | 0x36, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 {"message" , DHCP_STRING | 0x38, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 {"vlanid" , DHCP_NUM32 | 0x84, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 {"vlanpriority" , DHCP_NUM32 | 0x85, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 {"dns" , DHCP_IPLIST | 0x06, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 {"wins" , DHCP_IPLIST | 0x2c, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 {"nissrv" , DHCP_IPLIST | 0x29, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 {"ntpsrv" , DHCP_IPLIST | 0x2a, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 {"lprsrv" , DHCP_IPLIST | 0x09, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 {"swapsrv" , DHCP_IP | 0x10, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 {"routes" , DHCP_STCRTS | 0x21, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 {"staticroutes" , DHCP_STCRTS | 0x79, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 {"msstaticroutes" , DHCP_STCRTS | 0xf9, NULL, 0}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 }; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 struct fd_pair { int rd; int wr; }; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 static server_config_t gconfig; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 static server_state_t gstate; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 static uint8_t infomode; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 static struct fd_pair sigfd; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 static int constone = 1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 // calculate options size. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 static int dhcp_opt_size(uint8_t *optionptr) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 int i = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 for(;optionptr[i] != 0xff; i++) if(optionptr[i] != 0x00) i += optionptr[i + 1] + 2 -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 return i; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 // calculates checksum for dhcp messeges. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 static uint16_t dhcp_checksum(void *addr, int count) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 int32_t sum = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
227 uint16_t tmp = 0, *source = (uint16_t *)addr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
228 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 while (count > 1) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 sum += *source++; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 count -= 2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
232 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 if (count > 0) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
234 *(uint8_t*)&tmp = *(uint8_t*)source; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 sum += tmp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
236 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 return ~sum; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
239 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 // gets information of INTERFACE and updates IFINDEX, MAC and IP |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 static int get_interface(const char *interface, int *ifindex, uint32_t *oip, uint8_t *mac) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 struct ifreq req; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 struct sockaddr_in *ip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
246 int fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
247 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 req.ifr_addr.sa_family = AF_INET; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 strncpy(req.ifr_name, interface, IFNAMSIZ); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
250 req.ifr_name[IFNAMSIZ-1] = '\0'; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
251 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 xioctl(fd, SIOCGIFFLAGS, &req); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 if (!(req.ifr_flags & IFF_UP)) return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 if (oip) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 xioctl(fd, SIOCGIFADDR, &req); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 ip = (struct sockaddr_in*) &req.ifr_addr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 dbg("IP %s\n", inet_ntoa(ip->sin_addr)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 *oip = ntohl(ip->sin_addr.s_addr); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 if (ifindex) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 xioctl(fd, SIOCGIFINDEX, &req); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 dbg("Adapter index %d\n", req.ifr_ifindex); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 *ifindex = req.ifr_ifindex; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 if (mac) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 xioctl(fd, SIOCGIFHWADDR, &req); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 memcpy(mac, req.ifr_hwaddr.sa_data, 6); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 dbg("MAC %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
271 close(fd); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 /* |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 *logs messeges to syslog or console |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 *opening the log is still left with applet. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 *FIXME: move to more relevent lib. probably libc.c |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 */ |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 static void infomsg(uint8_t infomode, char *s, ...) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
282 int used; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
283 char *msg; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 va_list p, t; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 if (infomode == LOG_SILENT) return; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
287 va_start(p, s); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
288 va_copy(t, p); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 used = vsnprintf(NULL, 0, s, t); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 used++; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
291 va_end(t); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 msg = xmalloc(used); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
294 vsnprintf(msg, used, s, p); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
295 va_end(p); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
297 if (infomode & LOG_SYSTEM) syslog(LOG_INFO, "%s", msg); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 if (infomode & LOG_CONSOLE) printf("%s\n", msg); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
299 free(msg); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
300 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
301 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
302 /* |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
303 * Writes self PID in file PATH |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
304 * FIXME: libc implementation only writes in /var/run |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 * this is more generic as some implemenation may provide |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
306 * arguments to write in specific file. as dhcpd does. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 */ |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 static void write_pid(char *path) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 int pidfile = open(path, O_CREAT | O_WRONLY | O_TRUNC, 0666); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 if (pidfile > 0) { |
1041
d3f9e55e350a
Convert dhcp/dhcpd from utoa() to sprintf().
Rob Landley <rob@landley.net>
parents:
1005
diff
changeset
|
312 char pidbuf[12]; |
d3f9e55e350a
Convert dhcp/dhcpd from utoa() to sprintf().
Rob Landley <rob@landley.net>
parents:
1005
diff
changeset
|
313 |
d3f9e55e350a
Convert dhcp/dhcpd from utoa() to sprintf().
Rob Landley <rob@landley.net>
parents:
1005
diff
changeset
|
314 sprintf(pidbuf, "%u", (unsigned)getpid()); |
1005
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
315 write(pidfile, pidbuf, strlen(pidbuf)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
316 close(pidfile); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
317 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
318 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
320 // Generic signal handler real handling is done in main funcrion. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 static void signal_handler(int sig) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 unsigned char ch = sig; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 if (write(sigfd.wr, &ch, 1) != 1) dbg("can't send signal\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 // signal setup for SIGUSR1 SIGTERM |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 static int setup_signal() |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 if (pipe((int *)&sigfd) < 0) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 dbg("signal pipe failed\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 fcntl(sigfd.wr , F_SETFD, FD_CLOEXEC); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 fcntl(sigfd.rd , F_SETFD, FD_CLOEXEC); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
336 int flags = fcntl(sigfd.wr, F_GETFL); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
337 fcntl(sigfd.wr, F_SETFL, flags | O_NONBLOCK); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 signal(SIGUSR1, signal_handler); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
339 signal(SIGTERM, signal_handler); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
340 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
341 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
343 // String STR to UINT32 conversion strored in VAR |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
344 static int strtou32(const char *str, void *var) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
345 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 char *endptr = NULL; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 int base = 10; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 errno=0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 *((uint32_t*)(var)) = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
350 if (str[0]=='0' && (str[1]=='x' || str[1]=='X')) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 base = 16; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
352 str+=2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
353 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 long ret_val = strtol(str, &endptr, base); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
355 if (errno) infomsg(infomode, "config : Invalid num %s",str); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 else if (endptr && (*endptr!='\0'||endptr == str)) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
357 infomsg(infomode, "config : Not a valid num %s",str); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
358 else *((uint32_t*)(var)) = (uint32_t)ret_val; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 // copy string STR in variable VAR |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 static int strinvar(const char *str, void *var) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 char **dest = var; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 if (*dest) free(*dest); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 *dest = strdup(str); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
370 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
371 // IP String STR to binary data. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 static int striptovar(const char *str, void *var) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 in_addr_t addr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 *((uint32_t*)(var)) = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
376 if(!str) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
377 error_msg("config : NULL address string \n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
378 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 if((addr = inet_addr(str)) == -1) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
381 error_msg("config : wrong address %s \n",str ); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
383 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 *((uint32_t*)(var)) = (uint32_t)addr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
385 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
386 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
387 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 // String to dhcp option conversion |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
389 static int strtoopt(const char *str, void *var) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
390 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
391 char *option, *valstr, *grp, *tp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
392 uint32_t optcode = 0, inf = infomode, convtmp, mask, nip, router; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
393 uint16_t flag = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
394 int count, size = ARRAY_LEN(options_list); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
396 if (!*str) return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
397 if (!(option = strtok((char*)str, " \t="))) return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
398 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
399 infomode = LOG_SILENT; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
400 strtou32(option, (uint32_t*)&optcode); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
401 infomode = inf; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
402 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
403 if (optcode > 0 && optcode < 256) { // raw option |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
404 for (count = 0; count < size; count++) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
405 if ((options_list[count].code & 0X00FF) == optcode) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
406 flag = (options_list[count].code & 0XFF00); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
407 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
408 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
409 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
410 } else { //string option |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
411 for (count = 0; count < size; count++) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
412 if (!strncmp(options_list[count].key, option, strlen(options_list[count].key))) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
413 flag = (options_list[count].code & 0XFF00); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
414 optcode = (options_list[count].code & 0X00FF); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
415 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
416 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
417 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
418 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
419 if (count == size) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
420 infomsg(inf, "config : Obsolete OR Unknown Option : %s", option); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
421 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
422 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
423 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
424 if (!flag || !optcode) return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
425 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
426 if (!(valstr = strtok(NULL, " \t"))) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
427 dbg("config : option %s has no value defined.\n", option); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
428 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
429 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
430 dbg(" value : %-20s : ", valstr); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
431 switch (flag) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 case DHCP_NUM32: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
433 options_list[count].len = sizeof(uint32_t); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
434 options_list[count].val = xmalloc(sizeof(uint32_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
435 strtou32(valstr, &convtmp); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
436 memcpy(options_list[count].val, &convtmp, sizeof(uint32_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
437 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
438 case DHCP_NUM16: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
439 options_list[count].len = sizeof(uint16_t); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
440 options_list[count].val = xmalloc(sizeof(uint16_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
441 strtou32(valstr, &convtmp); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
442 memcpy(options_list[count].val, &convtmp, sizeof(uint16_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
443 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
444 case DHCP_NUM8: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
445 options_list[count].len = sizeof(uint8_t); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
446 options_list[count].val = xmalloc(sizeof(uint8_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
447 strtou32(valstr, &convtmp); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
448 memcpy(options_list[count].val, &convtmp, sizeof(uint8_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
449 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
450 case DHCP_IP: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
451 options_list[count].len = sizeof(uint32_t); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
452 options_list[count].val = xmalloc(sizeof(uint32_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
453 striptovar(valstr, options_list[count].val); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
454 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
455 case DHCP_STRING: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
456 options_list[count].len = strlen(valstr); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
457 options_list[count].val = strdup(valstr); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
458 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
459 case DHCP_IPLIST: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
460 while(valstr){ |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
461 options_list[count].val = xrealloc(options_list[count].val, options_list[count].len + sizeof(uint32_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
462 striptovar(valstr, ((uint8_t*)options_list[count].val)+options_list[count].len); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
463 options_list[count].len += sizeof(uint32_t); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
464 valstr = strtok(NULL," \t"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
465 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
466 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
467 case DHCP_IPPLST: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
468 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
469 case DHCP_STCRTS: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
470 /* Option binary format: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
471 * mask [one byte, 0..32] |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
472 * ip [0..4 bytes depending on mask] |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
473 * router [4 bytes] |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
474 * may be repeated |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
475 * staticroutes 10.0.0.0/8 10.127.0.1, 10.11.12.0/24 10.11.12.1 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
476 */ |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
477 grp = strtok(valstr, ",");; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
478 while(grp){ |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
479 while(*grp == ' ' || *grp == '\t') grp++; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
480 tp = strchr(grp, '/'); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
481 if (!tp) error_exit("wrong formated static route option"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
482 *tp = '\0'; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
483 mask = strtol(++tp, &tp, 10); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
484 if (striptovar(grp, (uint8_t*)&nip)<0) error_exit("wrong formated static route option"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
485 while(*tp == ' ' || *tp == '\t' || *tp == '-') tp++; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
486 if (striptovar(tp, (uint8_t*)&router)<0) error_exit("wrong formated static route option"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
487 options_list[count].val = xrealloc(options_list[count].val, options_list[count].len + 1 + mask/8 + 4); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
488 memcpy(((uint8_t*)options_list[count].val)+options_list[count].len, &mask, 1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
489 options_list[count].len += 1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
490 memcpy(((uint8_t*)options_list[count].val)+options_list[count].len, &nip, mask/8); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
491 options_list[count].len += mask/8; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
492 memcpy(((uint8_t*)options_list[count].val)+options_list[count].len, &router, 4); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
493 options_list[count].len += 4; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
494 tp = NULL; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
495 grp = strtok(NULL, ","); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
496 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
497 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
498 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
499 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
500 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
501 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
502 // Reads Static leases from STR and updates inner structures. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
503 static int get_staticlease(const char *str, void *var) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
504 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
505 struct static_lease_s *sltmp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
506 char *tkmac, *tkip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
507 int count; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
508 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
509 if (!*str) return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
510 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
511 if (!(tkmac = strtok((char*)str, " \t"))) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
512 infomsg(infomode, "config : static lease : mac not found"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
513 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
514 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
515 if (!(tkip = strtok(NULL, " \t"))) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
516 infomsg(infomode, "config : static lease : no ip bind to mac %s", tkmac); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
517 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
518 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
519 sltmp = xzalloc(sizeof(struct static_lease_s)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
520 for (count = 0; count < 6; count++, tkmac++) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
521 errno = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
522 sltmp->mac[count] = strtol(tkmac, &tkmac, 16); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
523 if (sltmp->mac[count]>255 || sltmp->mac[count]<0 || (*tkmac && *tkmac!=':') || errno) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
524 infomsg(infomode, "config : static lease : mac address wrong format"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
525 free(sltmp); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
526 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
527 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
528 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
529 striptovar(tkip, &sltmp->nip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
530 sltmp->next = gstate.sleases; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
531 gstate.sleases = sltmp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
532 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
533 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
534 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
535 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
536 static struct config_keyword keywords[] = { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
537 // keyword handler variable address default |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
538 {"start" , striptovar , (void*)&gconfig.start_ip , "192.168.0.20"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
539 {"end" , striptovar , (void*)&gconfig.end_ip , "192.168.0.254"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
540 {"interface" , strinvar , (void*)&gconfig.interface , "eth0"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
541 {"port" , strtou32 , (void*)&gconfig.port , "67"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
542 {"min_lease" , strtou32 , (void*)&gconfig.min_lease_sec, "60"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
543 {"max_leases" , strtou32 , (void*)&gconfig.max_leases , "235"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
544 {"auto_time" , strtou32 , (void*)&gconfig.auto_time , "7200"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
545 {"decline_time" , strtou32 , (void*)&gconfig.decline_time , "3600"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
546 {"conflict_time", strtou32 , (void*)&gconfig.conflict_time, "3600"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
547 {"offer_time" , strtou32 , (void*)&gconfig.offer_time , "60"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
548 {"lease_file" , strinvar , (void*)&gconfig.lease_file , "/var/lib/misc/dhcpd.leases"}, //LEASES_FILE |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
549 {"pidfile" , strinvar , (void*)&gconfig.pidfile , "/var/run/dhcpd.pid"}, //DPID_FILE |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
550 {"siaddr" , striptovar , (void*)&gconfig.siaddr_nip , "0.0.0.0"}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
551 {"option" , strtoopt , (void*)&gconfig.options , ""}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
552 {"opt" , strtoopt , (void*)&gconfig.options , ""}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
553 {"notify_file" , strinvar , (void*)&gconfig.notify_file , ""}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
554 {"sname" , strinvar , (void*)&gconfig.sname , ""}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
555 {"boot_file" , strinvar , (void*)&gconfig.boot_file , ""}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
556 {"static_lease" , get_staticlease , (void*)&gconfig.static_leases, ""}, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
557 }; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
558 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
559 // Parses the server config file and updates the global server config accordingly. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
560 static int parse_server_config(char *config_file, struct config_keyword *confkey) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
561 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
562 FILE *fs = NULL; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
563 char *confline_temp = NULL,*confline = NULL, *tk = NULL, *tokens[2] = {NULL, NULL}; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
564 int len, linelen, tcount, count, size = ARRAY_LEN(keywords); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
565 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
566 for (count = 0; count < size; count++) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
567 if (confkey[count].handler) confkey[count].handler(confkey[count].def, confkey[count].var); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
568 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
569 if (!(fs = fopen(config_file, "r"))) perror_msg("%s", config_file); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
570 for (len = 0, linelen = 0; fs;) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
571 len = getline(&confline_temp, (size_t*) &linelen, fs); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
572 confline = confline_temp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
573 if (len <= 0) break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
574 for (; *confline == ' '; confline++, len--); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
575 if ((confline[0] == '#') || (confline[0] == '\n')) goto free_conf_continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
576 tk = strchr(confline, '#'); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
577 if (tk) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
578 for (; *(tk-1)==' ' || *(tk-1)=='\t'; tk--); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
579 *tk = '\0'; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
580 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
581 tk = strchr(confline, '\n'); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
582 if (tk) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
583 for (; *(tk-1)==' ' || *(tk-1)=='\t'; tk--); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
584 *tk = '\0'; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
585 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
586 for (tcount=0, tk=strtok(confline, " \t"); tk && (tcount < 2); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
587 tcount++, tk=strtok(NULL,(tcount==1)?"":" \t")) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
588 while ((*tk == '\t') || (*tk == ' ')) tk++; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
589 tokens[tcount] = xstrdup(tk); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
590 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
591 if (tcount<=1) goto free_tk0_continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
592 for (count = 0; count < size; count++) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
593 if (!strcmp(confkey[count].keyword,tokens[0])) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
594 dbg("got config : %15s : ", confkey[count].keyword); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
595 if (confkey[count].handler(tokens[1], confkey[count].var) == 0) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
596 dbg("%s \n", tokens[1]); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
597 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
598 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
599 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
600 if (tokens[1]) { free(tokens[1]); tokens[1] = NULL; } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
601 free_tk0_continue: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
602 if (tokens[0]) { free(tokens[0]); tokens[0] = NULL; } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
603 free_conf_continue: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
604 free(confline_temp); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
605 confline_temp = NULL; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
606 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
607 if (fs) fclose(fs); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
608 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
609 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
610 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
611 // opens UDP socket for listen |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
612 static int open_listensock(void) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
613 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
614 struct sockaddr_in addr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
615 struct ifreq ifr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
616 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
617 if (gstate.listensock > 0) close(gstate.listensock); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
618 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
619 dbg("Opening listen socket on *:%d %s\n", gconfig.port, gconfig.interface); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
620 gstate.listensock = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
621 setsockopt(gstate.listensock, SOL_SOCKET, SO_REUSEADDR, &constone, sizeof(constone)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
622 if (setsockopt(gstate.listensock, SOL_SOCKET, SO_BROADCAST, &constone, sizeof(constone)) == -1) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
623 dbg("OPEN : brodcast ioctl failed.\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
624 close(gstate.listensock); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
625 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
626 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
627 memset(&ifr, 0, sizeof(ifr)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
628 strncpy(ifr.ifr_name, gconfig.interface, IFNAMSIZ); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
629 ifr.ifr_name[IFNAMSIZ -1] = '\0'; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
630 setsockopt(gstate.listensock, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
631 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
632 memset(&addr, 0, sizeof(addr)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
633 addr.sin_family = AF_INET; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
634 addr.sin_port = (flag_chk(FLAG_P))?htons(TT.port):htons(67); //SERVER_PORT |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
635 addr.sin_addr.s_addr = INADDR_ANY ; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
636 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
637 if (bind(gstate.listensock, (struct sockaddr *) &addr, sizeof(addr))) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
638 close(gstate.listensock); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
639 perror_exit("bind failed"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
640 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
641 dbg("OPEN : success\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
642 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
643 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
644 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
645 // Sends data through raw socket. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
646 static int send_packet(uint8_t broadcast) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
647 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
648 struct sockaddr_ll dest_sll; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
649 dhcp_raw_t packet; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
650 unsigned padding; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
651 int fd, result = -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
652 uint8_t bmacaddr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
653 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
654 memset(&packet, 0, sizeof(dhcp_raw_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
655 memcpy(&packet.dhcp, &gstate.send_pkt, sizeof(dhcp_msg_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
656 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
657 if ((fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
658 dbg("SEND : socket failed\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
659 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
660 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
661 memset(&dest_sll, 0, sizeof(dest_sll)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
662 dest_sll.sll_family = AF_PACKET; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
663 dest_sll.sll_protocol = htons(ETH_P_IP); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
664 dest_sll.sll_ifindex = gconfig.ifindex; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
665 dest_sll.sll_halen = 6; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
666 memcpy(dest_sll.sll_addr, (broadcast)?bmacaddr:gstate.rcvd_pkt.chaddr , 6); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
667 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
668 if (bind(fd, (struct sockaddr *) &dest_sll, sizeof(dest_sll)) < 0) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
669 dbg("SEND : bind failed\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
670 close(fd); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
671 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
672 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
673 padding = 308 - 1 - dhcp_opt_size(gstate.send_pkt.options); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
674 packet.iph.protocol = IPPROTO_UDP; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
675 packet.iph.saddr = gconfig.server_nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
676 packet.iph.daddr = (broadcast || (gstate.rcvd_pkt.ciaddr == 0))?INADDR_BROADCAST:gstate.rcvd_pkt.ciaddr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
677 packet.udph.source = htons(67);//SERVER_PORT |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
678 packet.udph.dest = htons(68); //CLIENT_PORT |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
679 packet.udph.len = htons(sizeof(dhcp_raw_t) - sizeof(struct iphdr) - padding); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
680 packet.iph.tot_len = packet.udph.len; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
681 packet.udph.check = dhcp_checksum(&packet, sizeof(dhcp_raw_t) - padding); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
682 packet.iph.tot_len = htons(sizeof(dhcp_raw_t) - padding); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
683 packet.iph.ihl = sizeof(packet.iph) >> 2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
684 packet.iph.version = IPVERSION; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
685 packet.iph.ttl = IPDEFTTL; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
686 packet.iph.check = dhcp_checksum(&packet.iph, sizeof(packet.iph)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
687 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
688 result = sendto(fd, &packet, sizeof(dhcp_raw_t) - padding, 0, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
689 (struct sockaddr *) &dest_sll, sizeof(dest_sll)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
690 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
691 dbg("sendto %d\n", result); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
692 close(fd); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
693 if (result < 0) dbg("PACKET send error\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
694 return result; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
695 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
696 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
697 // Reads from UDP socket |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
698 static int read_packet(void) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
699 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
700 int ret; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
701 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
702 memset(&gstate.rcvd_pkt, 0, sizeof(dhcp_msg_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
703 ret = read(gstate.listensock, &gstate.rcvd_pkt, sizeof(dhcp_msg_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
704 if (ret < 0) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
705 dbg("Packet read error, ignoring. \n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
706 return ret; // returns -1 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
707 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
708 if (gstate.rcvd_pkt.cookie != htonl(DHCP_MAGIC)) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
709 dbg("Packet with bad magic, ignoring. \n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
710 return -2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
711 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
712 if (gstate.rcvd_pkt.op != 1) { //BOOTPREQUEST |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
713 dbg("Not a BOOT REQUEST ignoring. \n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
714 return -2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
715 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
716 if (gstate.rcvd_pkt.hlen != 6) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
717 dbg("hlen != 6 ignoring. \n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
718 return -2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
719 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
720 dbg("Received a packet. Size : %d \n", ret); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
721 return ret; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
722 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
723 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
724 // Preapres a dhcp packet with defaults and configs |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
725 static uint8_t* prepare_send_pkt(void) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
726 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
727 memset((void*)&gstate.send_pkt, 0, sizeof(gstate.send_pkt)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
728 gstate.send_pkt.op = 2; //BOOTPREPLY |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
729 gstate.send_pkt.htype = 1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
730 gstate.send_pkt.hlen = 6; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
731 gstate.send_pkt.xid = gstate.rcvd_pkt.xid; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
732 gstate.send_pkt.cookie = htonl(DHCP_MAGIC); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
733 gstate.send_pkt.nsiaddr = gconfig.server_nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
734 memcpy(gstate.send_pkt.chaddr, gstate.rcvd_pkt.chaddr, 16); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
735 gstate.send_pkt.options[0] = DHCP_OPT_END; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
736 return gstate.send_pkt.options; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
737 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
738 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
739 // Sets a option value in dhcp packet's option field |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
740 static uint8_t* set_optval(uint8_t *optptr, uint16_t opt, void *var, size_t len) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
741 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
742 while (*optptr != DHCP_OPT_END) optptr++; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
743 *optptr++ = (uint8_t)(opt & 0x00FF); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
744 *optptr++ = (uint8_t) len; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
745 memcpy(optptr, var, len); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
746 optptr += len; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
747 *optptr = DHCP_OPT_END; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
748 return optptr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
749 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
750 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
751 // Gets a option value from dhcp packet's option field |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
752 static uint8_t* get_optval(uint8_t *optptr, uint16_t opt, void *var) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
753 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
754 size_t len; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
755 uint8_t overloaded = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
756 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
757 while (1) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
758 while (*optptr == DHCP_OPT_PADDING) optptr++; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
759 if ((*optptr & 0x00FF) == DHCP_OPT_END) break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
760 if ((*optptr & 0x00FF) == DHCP_OPT_OPTION_OVERLOAD) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
761 overloaded = optptr[2]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
762 optptr += optptr[1] + 2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
763 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
764 len = optptr[1]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
765 if (*optptr == (opt & 0x00FF)) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
766 switch (opt & 0xFF00) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
767 case DHCP_NUM32: // FALLTHROUGH |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
768 case DHCP_IP: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
769 memcpy(var, optptr+2, sizeof(uint32_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
770 optptr += len + 2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
771 return optptr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
772 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
773 case DHCP_NUM16: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
774 memcpy(var, optptr+2, sizeof(uint16_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
775 optptr += len + 2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
776 return optptr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
777 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
778 case DHCP_NUM8: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
779 memcpy(var, optptr+2, sizeof(uint8_t)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
780 optptr += len + 2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
781 return optptr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
782 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
783 case DHCP_STRING: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
784 var = xstrndup((char*) optptr, len); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
785 optptr += len + 2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
786 return optptr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
787 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
788 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
789 optptr += len + 2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
790 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
791 if ((overloaded == 1) | (overloaded == 3)) get_optval((uint8_t*)&gstate.rcvd_pkt.file, opt, var); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
792 if ((overloaded == 2) | (overloaded == 3)) get_optval((uint8_t*)&gstate.rcvd_pkt.sname, opt, var); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
793 return optptr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
794 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
795 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
796 // Retrives Requested Parameter list from dhcp req packet. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
797 static uint8_t get_reqparam(uint8_t **list) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
798 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
799 uint8_t len, *optptr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
800 if(*list) free(*list); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
801 for (optptr = gstate.rcvd_pkt.options; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
802 *optptr && *optptr!=((DHCP_OPT_PARAM_REQ) & 0x00FF); optptr+=optptr[1]+2); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
803 len = *++optptr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
804 *list = xzalloc(len+1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
805 memcpy(*list, ++optptr, len); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
806 return len; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
807 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
808 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
809 // Sets values of req param in dhcp offer packet. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
810 static uint8_t* set_reqparam(uint8_t *optptr, uint8_t *list) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
811 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
812 uint8_t reqcode; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
813 int count, size = ARRAY_LEN(options_list); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
814 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
815 while (*list) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
816 reqcode = *list++; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
817 for (count = 0; count < size; count++) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
818 if ((options_list[count].code & 0X00FF)==reqcode) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
819 if (!(options_list[count].len) || !(options_list[count].val)) break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
820 for (; *optptr && *optptr!=DHCP_OPT_END; optptr+=optptr[1]+2); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
821 *optptr++ = (uint8_t) (options_list[count].code & 0x00FF); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
822 *optptr++ = (uint8_t) options_list[count].len; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
823 memcpy(optptr, options_list[count].val, options_list[count].len); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
824 optptr += options_list[count].len; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
825 *optptr = DHCP_OPT_END; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
826 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
827 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
828 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
829 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
830 return optptr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
831 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
832 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
833 static void run_notify(char **argv) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
834 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
835 struct stat sts; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
836 volatile int error = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
837 pid_t pid; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
838 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
839 if (stat(argv[0], &sts) == -1 && errno == ENOENT) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
840 infomsg(infomode, "notify file: %s : not exist.", argv[0]); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
841 return; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
842 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
843 fflush(NULL); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
844 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
845 pid = vfork(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
846 if (pid < 0) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
847 dbg("Fork failed.\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
848 return; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
849 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
850 if (!pid) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
851 execvp(argv[0], argv); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
852 error = errno; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
853 _exit(111); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
854 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
855 if (error) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
856 waitpid(pid, NULL, 0); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
857 errno = error; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
858 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
859 dbg("script complete.\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
860 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
861 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
862 static int write_leasefile(void) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
863 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
864 int fd; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
865 uint32_t curr, tmp_time; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
866 int64_t timestamp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
867 struct arg_list *listdls = gstate.dleases; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
868 dyn_lease *dls; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
869 |
1593
f2cac60ab2d3
Switching on fortify was not kind to the pending directory. Fix the actual build break (open(O_CREAT) without permissions).
Rob Landley <rob@landley.net>
parents:
1391
diff
changeset
|
870 if ((fd = open(gconfig.lease_file, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0) { |
1005
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
871 perror_msg("can't open %s ", gconfig.lease_file); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
872 return fd; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
873 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
874 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
875 curr = timestamp = time(NULL); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
876 timestamp = SWAP_BE64(timestamp); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
877 writeall(fd, ×tamp, sizeof(timestamp)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
878 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
879 while (listdls) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
880 dls = (dyn_lease*)listdls->arg; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
881 tmp_time = dls->expires; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
882 dls->expires -= curr; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
883 if ((int32_t) dls->expires < 0) goto skip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
884 dls->expires = htonl(dls->expires); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
885 writeall(fd, dls, sizeof(dyn_lease)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
886 skip: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
887 dls->expires = tmp_time; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
888 listdls = listdls->next; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
889 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
890 close(fd); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
891 if (gconfig.notify_file) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
892 char *argv[3]; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
893 argv[0] = gconfig.notify_file; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
894 argv[1] = gconfig.lease_file; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
895 argv[2] = NULL; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
896 run_notify(argv); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
897 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
898 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
899 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
900 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
901 // Update max lease time from options. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
902 static void set_maxlease(void) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
903 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
904 int count, size = ARRAY_LEN(options_list); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
905 for (count = 0; count < size; count++) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
906 if (options_list[count].val && options_list[count].code == (DHCP_OPT_LEASE_TIME)) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
907 gconfig.max_lease_sec = *((uint32_t*)options_list[count].val); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
908 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
909 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
910 if (!gconfig.max_lease_sec) gconfig.max_lease_sec = (60*60*24*10);// DEFAULT_LEASE_TIME; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
911 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
912 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
913 // Returns lease time for client. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
914 static uint32_t get_lease(uint32_t req_exp) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
915 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
916 uint32_t now = time(NULL); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
917 req_exp = req_exp - now; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
918 if ((req_exp <= 0) || (req_exp > gconfig.max_lease_sec)) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
919 return gconfig.max_lease_sec; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
920 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
921 if (req_exp < gconfig.min_lease_sec) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
922 return gconfig.min_lease_sec; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
923 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
924 return req_exp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
925 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
926 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
927 // Verify ip NIP in current leases ( assigned or not) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
928 static int verifyip_in_lease(uint32_t nip, uint8_t mac[6]) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
929 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
930 static_lease *sls; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
931 struct arg_list *listdls; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
932 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
933 for (listdls = gstate.dleases; listdls; listdls = listdls->next) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
934 if (((dyn_lease*) listdls->arg)->lease_nip == nip) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
935 if (((int32_t)(((dyn_lease*) listdls->arg)->expires) - time(NULL)) < 0) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
936 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
937 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
938 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
939 if (!memcmp(((dyn_lease*) listdls->arg)->lease_mac, mac, 6)) return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
940 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
941 for (sls = gstate.sleases; sls; sls = sls->next) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
942 if (sls->nip == nip) return -2; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
943 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
944 if ((ntohl(nip) < gconfig.start_ip) || (ntohl(nip) > gconfig.end_ip)) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
945 return -3; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
946 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
947 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
948 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
949 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
950 // add ip assigned_nip to dynamic lease. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
951 static int addip_to_lease(uint32_t assigned_nip, uint8_t mac[6], uint32_t *req_exp, char *hostname, uint8_t update) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
952 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
953 dyn_lease *dls; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
954 struct arg_list *listdls = gstate.dleases; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
955 uint32_t now = time(NULL); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
956 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
957 while (listdls) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
958 if (!memcmp(((dyn_lease*) listdls->arg)->lease_mac, mac, 6)) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
959 if (update) *req_exp = get_lease(*req_exp + ((dyn_lease*) listdls->arg)->expires); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
960 ((dyn_lease*) listdls->arg)->expires = *req_exp + now; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
961 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
962 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
963 listdls = listdls->next; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
964 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
965 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
966 dls = xzalloc(sizeof(dyn_lease)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
967 memcpy(dls->lease_mac, mac, 6); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
968 dls->lease_nip = assigned_nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
969 if (hostname) memcpy(dls->hostname, hostname, 20); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
970 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
971 if (update) *req_exp = get_lease(*req_exp + now); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
972 dls->expires = *req_exp + now; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
973 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
974 listdls = xzalloc(sizeof(struct arg_list)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
975 listdls->next = gstate.dleases; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
976 listdls->arg = (char*)dls; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
977 gstate.dleases = listdls; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
978 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
979 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
980 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
981 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
982 // delete ip assigned_nip from dynamic lease. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
983 static int delip_from_lease(uint32_t assigned_nip, uint8_t mac[6], uint32_t del_time) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
984 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
985 struct arg_list *listdls = gstate.dleases; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
986 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
987 while (listdls) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
988 if (!memcmp(((dyn_lease*) listdls->arg)->lease_mac, mac, 6)) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
989 ((dyn_lease*) listdls->arg)->expires = del_time + time(NULL); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
990 return 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
991 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
992 listdls = listdls->next; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
993 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
994 return -1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
995 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
996 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
997 // returns a IP from static, dynamic leases or free ip pool, 0 otherwise. |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
998 static uint32_t getip_from_pool(uint32_t req_nip, uint8_t mac[6], uint32_t *req_exp, char *hostname) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
999 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1000 uint32_t nip = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1001 static_lease *sls = gstate.sleases; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1002 struct arg_list *listdls = gstate.dleases, *tmp = NULL; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1003 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1004 if (req_nip && (!verifyip_in_lease(req_nip, mac))) nip = req_nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1005 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1006 if (!nip) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1007 while (listdls) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1008 if (!memcmp(((dyn_lease*)listdls->arg)->lease_mac, mac, 6)) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1009 nip = ((dyn_lease*)listdls->arg)->lease_nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1010 if (tmp) tmp->next = listdls->next; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1011 else gstate.dleases = listdls->next; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1012 free(listdls->arg); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1013 free(listdls); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1014 if (verifyip_in_lease(nip, mac) < 0) nip = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1015 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1016 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1017 tmp = listdls; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1018 listdls = listdls->next; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1019 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1020 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1021 if (!nip) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1022 while (sls) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1023 if (memcmp(sls->mac, mac, 6) == 0) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1024 nip = sls->nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1025 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1026 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1027 sls = sls->next; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1028 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1029 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1030 if (!nip) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1031 for (nip = htonl(gconfig.start_ip); ntohl(nip) <= gconfig.end_ip; ) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1032 if (!verifyip_in_lease(nip, mac)) break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1033 nip = ntohl(nip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1034 nip = htonl(++nip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1035 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1036 if (ntohl(nip) > gconfig.end_ip) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1037 nip = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1038 infomsg(infomode, "can't find free IP in IP Pool."); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1039 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1040 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1041 if (nip) addip_to_lease(nip, mac, req_exp, hostname, 1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1042 return nip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1043 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1044 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1045 static int read_leasefile(void) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1046 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1047 uint32_t passed, ip; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1048 int32_t tmp_time; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1049 int64_t timestamp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1050 dyn_lease *dls; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1051 int ret = -1, fd = open(gconfig.lease_file, O_RDONLY); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1052 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1053 if (fd < 0) return fd; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1054 dls = xzalloc(sizeof(dyn_lease)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1055 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1056 if (read(fd, ×tamp, sizeof(timestamp)) != sizeof(timestamp)) goto error_exit; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1057 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1058 timestamp = SWAP_BE64(timestamp); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1059 passed = time(NULL) - timestamp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1060 if ((uint64_t)passed > 12 * 60 * 60) goto error_exit; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1061 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1062 while (read(fd, dls, sizeof(dyn_lease)) == sizeof(dyn_lease)) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1063 ip = ntohl(dls->lease_nip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1064 if (ip >= gconfig.start_ip && ip <= gconfig.end_ip) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1065 tmp_time = ntohl(dls->expires) - passed; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1066 if (tmp_time < 0) continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1067 addip_to_lease(dls->lease_nip, dls->lease_mac, (uint32_t*)&tmp_time, dls->hostname, 0); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1068 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1069 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1070 ret = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1071 error_exit: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1072 free(dls); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1073 close(fd); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1074 return ret; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1075 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1076 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1077 void dhcpd_main(void) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1078 { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1079 struct timeval tv; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1080 int retval; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1081 uint8_t *optptr, msgtype = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1082 uint32_t waited = 0, serverid = 0, requested_nip = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1083 uint32_t reqested_lease = 0, ip_pool_size = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1084 char *hstname = NULL; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1085 fd_set rfds; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1086 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1087 infomode = LOG_CONSOLE; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1088 if (!(flag_chk(FLAG_f))) { |
1391
6a06541c090c
Use libc daemon() instead of pending daemonize.
Rob Landley <rob@landley.net>
parents:
1265
diff
changeset
|
1089 daemon(0,0); |
1005
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1090 infomode = LOG_SILENT; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1091 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1092 if (flag_chk(FLAG_S)) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1093 openlog("UDHCPD :", LOG_PID, LOG_DAEMON); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1094 infomode |= LOG_SYSTEM; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1095 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1096 setlinebuf(stdout); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1097 parse_server_config((toys.optc==1)?toys.optargs[0]:"/etc/dhcpd.conf", keywords); //DHCPD_CONF_FILE |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1098 infomsg(infomode, "toybox dhcpd started"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1099 gconfig.start_ip = ntohl(gconfig.start_ip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1100 gconfig.end_ip = ntohl(gconfig.end_ip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1101 ip_pool_size = gconfig.end_ip - gconfig.start_ip + 1; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1102 if (gconfig.max_leases > ip_pool_size) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1103 error_msg("max_leases=%u is too big, setting to %u", (unsigned) gconfig.max_leases, ip_pool_size); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1104 gconfig.max_leases = ip_pool_size; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1105 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1106 write_pid(gconfig.pidfile); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1107 set_maxlease(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1108 read_leasefile(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1109 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1110 if (get_interface(gconfig.interface, &gconfig.ifindex, &gconfig.server_nip, |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1111 gconfig.server_mac)<0) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1112 perror_exit("Failed to get interface %s", gconfig.interface); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1113 gconfig.server_nip = htonl(gconfig.server_nip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1114 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1115 setup_signal(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1116 open_listensock(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1117 fcntl(gstate.listensock, F_SETFD, FD_CLOEXEC); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1118 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1119 for (;;) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1120 uint32_t timestmp = time(NULL); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1121 FD_ZERO(&rfds); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1122 FD_SET(gstate.listensock, &rfds); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1123 FD_SET(sigfd.rd, &rfds); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1124 tv.tv_sec = gconfig.auto_time - waited; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1125 tv.tv_usec = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1126 retval = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1127 serverid = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1128 msgtype = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1129 |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1130 int maxfd = (sigfd.rd > gstate.listensock)? sigfd.rd : gstate.listensock; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1131 dbg("select waiting ....\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1132 retval = select(maxfd + 1, &rfds, NULL, NULL, (gconfig.auto_time?&tv:NULL)); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1133 if (retval < 0) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1134 if (errno == EINTR) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1135 waited += (unsigned) time(NULL) - timestmp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1136 continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1137 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1138 dbg("Error in select wait again...\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1139 continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1140 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1141 if (!retval) { // Timed out |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1142 dbg("select wait Timed Out...\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1143 waited = 0; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1144 write_leasefile(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1145 if (get_interface(gconfig.interface, &gconfig.ifindex, &gconfig.server_nip, gconfig.server_mac)<0) |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1146 perror_exit("Interface lost %s\n", gconfig.interface); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1147 gconfig.server_nip = htonl(gconfig.server_nip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1148 continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1149 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1150 if (FD_ISSET(sigfd.rd, &rfds)) { // Some Activity on RDFDs : is signal |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1151 unsigned char sig; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1152 if (read(sigfd.rd, &sig, 1) != 1) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1153 dbg("signal read failed.\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1154 continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1155 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1156 switch (sig) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1157 case SIGUSR1: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1158 infomsg(infomode, "Received SIGUSR1"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1159 write_leasefile(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1160 continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1161 case SIGTERM: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1162 infomsg(infomode, "Received SIGTERM"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1163 write_leasefile(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1164 unlink(gconfig.pidfile); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1165 exit(0); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1166 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1167 default: break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1168 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1169 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1170 if (FD_ISSET(gstate.listensock, &rfds)) { // Some Activity on RDFDs : is socket |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1171 dbg("select listen sock read\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1172 if (read_packet() < 0) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1173 open_listensock(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1174 continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1175 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1176 waited += time(NULL) - timestmp; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1177 get_optval((uint8_t*)&gstate.rcvd_pkt.options, DHCP_OPT_MESSAGE_TYPE, &gstate.rqcode); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1178 if (gstate.rqcode == 0 || gstate.rqcode < DHCPDISCOVER |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1179 || gstate.rqcode > DHCPINFORM) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1180 dbg("no or bad message type option, ignoring packet.\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1181 continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1182 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1183 get_optval((uint8_t*) &gstate.rcvd_pkt.options, DHCP_OPT_SERVER_ID, &serverid); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1184 if (serverid && (serverid != gconfig.server_nip)) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1185 dbg("server ID doesn't match, ignoring packet.\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1186 continue; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1187 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1188 switch (gstate.rqcode) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1189 case DHCPDISCOVER: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1190 msgtype = DHCPOFFER; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1191 dbg("Message Type : DHCPDISCOVER\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1192 get_optval((uint8_t*) &gstate.rcvd_pkt.options, DHCP_OPT_REQUESTED_IP, &requested_nip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1193 get_optval((uint8_t*) &gstate.rcvd_pkt.options, DHCP_OPT_HOST_NAME, &hstname); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1194 reqested_lease = gconfig.offer_time; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1195 get_reqparam(&gstate.rqopt); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1196 optptr = prepare_send_pkt(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1197 gstate.send_pkt.yiaddr = getip_from_pool(requested_nip, gstate.rcvd_pkt.chaddr, &reqested_lease, hstname); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1198 if(!gstate.send_pkt.yiaddr){ |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1199 msgtype = DHCPNAK; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1200 optptr = set_optval(optptr, DHCP_OPT_MESSAGE_TYPE, &msgtype, 1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1201 send_packet(1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1202 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1203 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1204 get_optval((uint8_t*) &gstate.rcvd_pkt.options, DHCP_OPT_LEASE_TIME, &reqested_lease); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1205 reqested_lease = htonl(get_lease(reqested_lease + time(NULL))); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1206 optptr = set_optval(optptr, DHCP_OPT_MESSAGE_TYPE, &msgtype, 1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1207 optptr = set_optval(optptr, DHCP_OPT_SERVER_ID, &gconfig.server_nip, 4); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1208 optptr = set_optval(optptr, DHCP_OPT_LEASE_TIME, &reqested_lease, 4); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1209 optptr = set_reqparam(optptr, gstate.rqopt); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1210 send_packet(1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1211 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1212 case DHCPREQUEST: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1213 msgtype = DHCPACK; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1214 dbg("Message Type : DHCPREQUEST\n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1215 optptr = prepare_send_pkt(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1216 get_optval((uint8_t*) &gstate.rcvd_pkt.options, DHCP_OPT_REQUESTED_IP, &requested_nip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1217 get_optval((uint8_t*) &gstate.rcvd_pkt.options, DHCP_OPT_LEASE_TIME, &reqested_lease); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1218 get_optval((uint8_t*) &gstate.rcvd_pkt.options, DHCP_OPT_HOST_NAME, &hstname); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1219 gstate.send_pkt.yiaddr = getip_from_pool(requested_nip, gstate.rcvd_pkt.chaddr, &reqested_lease, hstname); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1220 if (!serverid) reqested_lease = gconfig.max_lease_sec; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1221 if (!gstate.send_pkt.yiaddr) { |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1222 msgtype = DHCPNAK; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1223 optptr = set_optval(optptr, DHCP_OPT_MESSAGE_TYPE, &msgtype, 1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1224 send_packet(1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1225 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1226 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1227 optptr = set_optval(optptr, DHCP_OPT_MESSAGE_TYPE, &msgtype, 1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1228 optptr = set_optval(optptr, DHCP_OPT_SERVER_ID, &gconfig.server_nip, 4); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1229 reqested_lease = htonl(reqested_lease); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1230 optptr = set_optval(optptr, DHCP_OPT_LEASE_TIME, &reqested_lease, 4); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1231 send_packet(1); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1232 write_leasefile(); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1233 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1234 case DHCPDECLINE:// FALL THROUGH |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1235 case DHCPRELEASE: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1236 dbg("Message Type : DHCPDECLINE or DHCPRELEASE \n"); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1237 get_optval((uint8_t*) &gstate.rcvd_pkt.options, DHCP_OPT_SERVER_ID, &serverid); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1238 if (serverid != gconfig.server_nip) break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1239 get_optval((uint8_t*) &gstate.rcvd_pkt.options, DHCP_OPT_REQUESTED_IP, &requested_nip); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1240 delip_from_lease(requested_nip, gstate.rcvd_pkt.chaddr, (gstate.rqcode==DHCPRELEASE)?0:gconfig.decline_time); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1241 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1242 default: |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1243 dbg("Message Type : %u\n", gstate.rqcode); |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1244 break; |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1245 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1246 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1247 } |
03f72b57a092
DHCP client and server, from Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1248 } |