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