diff options
Diffstat (limited to 'networking/udhcp/leases.c')
-rw-r--r-- | networking/udhcp/leases.c | 68 |
1 files changed, 35 insertions, 33 deletions
diff --git a/networking/udhcp/leases.c b/networking/udhcp/leases.c index 2f7847d74..5d8775f63 100644 --- a/networking/udhcp/leases.c +++ b/networking/udhcp/leases.c | |||
@@ -8,25 +8,41 @@ | |||
8 | #include "dhcpd.h" | 8 | #include "dhcpd.h" |
9 | 9 | ||
10 | 10 | ||
11 | uint8_t blank_chaddr[] = {[0 ... 15] = 0}; | 11 | /* Find the oldest expired lease, NULL if there are no expired leases */ |
12 | static struct dhcpOfferedAddr *oldest_expired_lease(void) | ||
13 | { | ||
14 | struct dhcpOfferedAddr *oldest = NULL; | ||
15 | unsigned long oldest_lease = time(0); | ||
16 | unsigned i; | ||
17 | |||
18 | |||
19 | for (i = 0; i < server_config.max_leases; i++) | ||
20 | if (oldest_lease > leases[i].expires) { | ||
21 | oldest_lease = leases[i].expires; | ||
22 | oldest = &(leases[i]); | ||
23 | } | ||
24 | return oldest; | ||
25 | } | ||
26 | |||
12 | 27 | ||
13 | /* clear every lease out that chaddr OR yiaddr matches and is nonzero */ | 28 | /* clear every lease out that chaddr OR yiaddr matches and is nonzero */ |
14 | void clear_lease(uint8_t *chaddr, uint32_t yiaddr) | 29 | static void clear_lease(const uint8_t *chaddr, uint32_t yiaddr) |
15 | { | 30 | { |
16 | unsigned int i, j; | 31 | unsigned i, j; |
17 | 32 | ||
18 | for (j = 0; j < 16 && !chaddr[j]; j++); | 33 | for (j = 0; j < 16 && !chaddr[j]; j++); |
19 | 34 | ||
20 | for (i = 0; i < server_config.max_leases; i++) | 35 | for (i = 0; i < server_config.max_leases; i++) |
21 | if ((j != 16 && !memcmp(leases[i].chaddr, chaddr, 16)) || | 36 | if ((j != 16 && memcmp(leases[i].chaddr, chaddr, 16) != 0) |
22 | (yiaddr && leases[i].yiaddr == yiaddr)) { | 37 | || (yiaddr && leases[i].yiaddr == yiaddr) |
38 | ) { | ||
23 | memset(&(leases[i]), 0, sizeof(struct dhcpOfferedAddr)); | 39 | memset(&(leases[i]), 0, sizeof(struct dhcpOfferedAddr)); |
24 | } | 40 | } |
25 | } | 41 | } |
26 | 42 | ||
27 | 43 | ||
28 | /* add a lease into the table, clearing out any old ones */ | 44 | /* add a lease into the table, clearing out any old ones */ |
29 | struct dhcpOfferedAddr *add_lease(uint8_t *chaddr, uint32_t yiaddr, unsigned long lease) | 45 | struct dhcpOfferedAddr *add_lease(const uint8_t *chaddr, uint32_t yiaddr, unsigned long lease) |
30 | { | 46 | { |
31 | struct dhcpOfferedAddr *oldest; | 47 | struct dhcpOfferedAddr *oldest; |
32 | 48 | ||
@@ -52,31 +68,14 @@ int lease_expired(struct dhcpOfferedAddr *lease) | |||
52 | } | 68 | } |
53 | 69 | ||
54 | 70 | ||
55 | /* Find the oldest expired lease, NULL if there are no expired leases */ | ||
56 | struct dhcpOfferedAddr *oldest_expired_lease(void) | ||
57 | { | ||
58 | struct dhcpOfferedAddr *oldest = NULL; | ||
59 | unsigned long oldest_lease = time(0); | ||
60 | unsigned int i; | ||
61 | |||
62 | |||
63 | for (i = 0; i < server_config.max_leases; i++) | ||
64 | if (oldest_lease > leases[i].expires) { | ||
65 | oldest_lease = leases[i].expires; | ||
66 | oldest = &(leases[i]); | ||
67 | } | ||
68 | return oldest; | ||
69 | |||
70 | } | ||
71 | |||
72 | |||
73 | /* Find the first lease that matches chaddr, NULL if no match */ | 71 | /* Find the first lease that matches chaddr, NULL if no match */ |
74 | struct dhcpOfferedAddr *find_lease_by_chaddr(uint8_t *chaddr) | 72 | struct dhcpOfferedAddr *find_lease_by_chaddr(const uint8_t *chaddr) |
75 | { | 73 | { |
76 | unsigned int i; | 74 | unsigned i; |
77 | 75 | ||
78 | for (i = 0; i < server_config.max_leases; i++) | 76 | for (i = 0; i < server_config.max_leases; i++) |
79 | if (!memcmp(leases[i].chaddr, chaddr, 16)) return &(leases[i]); | 77 | if (!memcmp(leases[i].chaddr, chaddr, 16)) |
78 | return &(leases[i]); | ||
80 | 79 | ||
81 | return NULL; | 80 | return NULL; |
82 | } | 81 | } |
@@ -85,10 +84,11 @@ struct dhcpOfferedAddr *find_lease_by_chaddr(uint8_t *chaddr) | |||
85 | /* Find the first lease that matches yiaddr, NULL is no match */ | 84 | /* Find the first lease that matches yiaddr, NULL is no match */ |
86 | struct dhcpOfferedAddr *find_lease_by_yiaddr(uint32_t yiaddr) | 85 | struct dhcpOfferedAddr *find_lease_by_yiaddr(uint32_t yiaddr) |
87 | { | 86 | { |
88 | unsigned int i; | 87 | unsigned i; |
89 | 88 | ||
90 | for (i = 0; i < server_config.max_leases; i++) | 89 | for (i = 0; i < server_config.max_leases; i++) |
91 | if (leases[i].yiaddr == yiaddr) return &(leases[i]); | 90 | if (leases[i].yiaddr == yiaddr) |
91 | return &(leases[i]); | ||
92 | 92 | ||
93 | return NULL; | 93 | return NULL; |
94 | } | 94 | } |
@@ -97,6 +97,8 @@ struct dhcpOfferedAddr *find_lease_by_yiaddr(uint32_t yiaddr) | |||
97 | /* check is an IP is taken, if it is, add it to the lease table */ | 97 | /* check is an IP is taken, if it is, add it to the lease table */ |
98 | static int check_ip(uint32_t addr) | 98 | static int check_ip(uint32_t addr) |
99 | { | 99 | { |
100 | static const uint8_t blank_chaddr[16]; /* 16 zero bytes */ | ||
101 | |||
100 | struct in_addr temp; | 102 | struct in_addr temp; |
101 | 103 | ||
102 | if (arpping(addr, server_config.server, server_config.arp, server_config.interface) == 0) { | 104 | if (arpping(addr, server_config.server, server_config.arp, server_config.interface) == 0) { |
@@ -105,7 +107,8 @@ static int check_ip(uint32_t addr) | |||
105 | inet_ntoa(temp), server_config.conflict_time); | 107 | inet_ntoa(temp), server_config.conflict_time); |
106 | add_lease(blank_chaddr, addr, server_config.conflict_time); | 108 | add_lease(blank_chaddr, addr, server_config.conflict_time); |
107 | return 1; | 109 | return 1; |
108 | } else return 0; | 110 | } |
111 | return 0; | ||
109 | } | 112 | } |
110 | 113 | ||
111 | 114 | ||
@@ -125,7 +128,7 @@ uint32_t find_address(int check_expired) | |||
125 | /* ie, 192.168.55.255 */ | 128 | /* ie, 192.168.55.255 */ |
126 | if ((addr & 0xFF) == 0xFF) continue; | 129 | if ((addr & 0xFF) == 0xFF) continue; |
127 | 130 | ||
128 | /* Only do if it isn't an assigned as a static lease */ | 131 | /* Only do if it isn't assigned as a static lease */ |
129 | if (!reservedIp(server_config.static_leases, htonl(addr))) { | 132 | if (!reservedIp(server_config.static_leases, htonl(addr))) { |
130 | 133 | ||
131 | /* lease is not taken */ | 134 | /* lease is not taken */ |
@@ -133,11 +136,10 @@ uint32_t find_address(int check_expired) | |||
133 | lease = find_lease_by_yiaddr(ret); | 136 | lease = find_lease_by_yiaddr(ret); |
134 | 137 | ||
135 | /* no lease or it expired and we are checking for expired leases */ | 138 | /* no lease or it expired and we are checking for expired leases */ |
136 | if ( (!lease || (check_expired && lease_expired(lease))) | 139 | if ((!lease || (check_expired && lease_expired(lease))) |
137 | && /* and it isn't on the network */ !check_ip(ret) | 140 | && /* and it isn't on the network */ !check_ip(ret) |
138 | ) { | 141 | ) { |
139 | return ret; | 142 | return ret; |
140 | break; | ||
141 | } | 143 | } |
142 | } | 144 | } |
143 | } | 145 | } |