Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/networking/udhcp/leases.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/networking/udhcp/leases.c
r821 r1770 1 /* vi: set sw=4 ts=4: */ 1 2 /* 2 3 * leases.c -- tools to manage DHCP leases … … 4 5 */ 5 6 6 #include <time.h> 7 #include <string.h> 8 #include <sys/socket.h> 9 #include <netinet/in.h> 10 #include <arpa/inet.h> 11 7 #include "common.h" 12 8 #include "dhcpd.h" 13 #include "files.h"14 #include "options.h"15 #include "leases.h"16 #include "arpping.h"17 #include "common.h"18 19 #include "static_leases.h"20 9 21 10 22 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 // TODO: use monotonic_sec() 16 unsigned long oldest_lease = time(0); 17 unsigned i; 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 23 27 24 28 /* clear every lease out that chaddr OR yiaddr matches and is nonzero */ 25 void clear_lease(uint8_t *chaddr, uint32_t yiaddr)29 static void clear_lease(const uint8_t *chaddr, uint32_t yiaddr) 26 30 { 27 unsigned i nt i, j;31 unsigned i, j; 28 32 29 for (j = 0; j < 16 && !chaddr[j]; j++); 33 for (j = 0; j < 16 && !chaddr[j]; j++) 34 continue; 30 35 31 36 for (i = 0; i < server_config.max_leases; i++) 32 if ((j != 16 && !memcmp(leases[i].chaddr, chaddr, 16)) || 33 (yiaddr && leases[i].yiaddr == yiaddr)) { 34 memset(&(leases[i]), 0, sizeof(struct dhcpOfferedAddr)); 37 if ((j != 16 && memcmp(leases[i].chaddr, chaddr, 16) == 0) 38 || (yiaddr && leases[i].yiaddr == yiaddr) 39 ) { 40 memset(&(leases[i]), 0, sizeof(leases[i])); 35 41 } 36 42 } … … 38 44 39 45 /* add a lease into the table, clearing out any old ones */ 40 struct dhcpOfferedAddr *add_lease( uint8_t *chaddr, uint32_t yiaddr, unsigned long lease)46 struct dhcpOfferedAddr *add_lease(const uint8_t *chaddr, uint32_t yiaddr, unsigned long lease) 41 47 { 42 48 struct dhcpOfferedAddr *oldest; … … 64 70 65 71 66 /* Find the oldest expired lease, NULL if there are no expired leases*/67 struct dhcpOfferedAddr * oldest_expired_lease(void)72 /* Find the first lease that matches chaddr, NULL if no match */ 73 struct dhcpOfferedAddr *find_lease_by_chaddr(const uint8_t *chaddr) 68 74 { 69 struct dhcpOfferedAddr *oldest = NULL; 70 unsigned long oldest_lease = time(0); 71 unsigned int i; 72 75 unsigned i; 73 76 74 77 for (i = 0; i < server_config.max_leases; i++) 75 if (oldest_lease > leases[i].expires) { 76 oldest_lease = leases[i].expires; 77 oldest = &(leases[i]); 78 } 79 return oldest; 80 81 } 82 83 84 /* Find the first lease that matches chaddr, NULL if no match */ 85 struct dhcpOfferedAddr *find_lease_by_chaddr(uint8_t *chaddr) 86 { 87 unsigned int i; 88 89 for (i = 0; i < server_config.max_leases; i++) 90 if (!memcmp(leases[i].chaddr, chaddr, 16)) return &(leases[i]); 78 if (!memcmp(leases[i].chaddr, chaddr, 16)) 79 return &(leases[i]); 91 80 92 81 return NULL; … … 97 86 struct dhcpOfferedAddr *find_lease_by_yiaddr(uint32_t yiaddr) 98 87 { 99 unsigned i nt i;88 unsigned i; 100 89 101 90 for (i = 0; i < server_config.max_leases; i++) 102 if (leases[i].yiaddr == yiaddr) return &(leases[i]); 91 if (leases[i].yiaddr == yiaddr) 92 return &(leases[i]); 103 93 104 94 return NULL; … … 107 97 108 98 /* check is an IP is taken, if it is, add it to the lease table */ 109 static int check_ip(uint32_t addr)99 static int nobody_responds_to_arp(uint32_t addr) 110 100 { 101 static const uint8_t blank_chaddr[16]; /* 16 zero bytes */ 102 111 103 struct in_addr temp; 104 int r; 112 105 113 if (arpping(addr, server_config.server, server_config.arp, server_config.interface) == 0) { 114 temp.s_addr = addr; 115 LOG(LOG_INFO, "%s belongs to someone, reserving it for %ld seconds", 116 inet_ntoa(temp), server_config.conflict_time); 117 add_lease(blank_chaddr, addr, server_config.conflict_time); 118 return 1; 119 } else return 0; 106 r = arpping(addr, server_config.server, server_config.arp, server_config.interface); 107 if (r) 108 return r; 109 110 temp.s_addr = addr; 111 bb_info_msg("%s belongs to someone, reserving it for %u seconds", 112 inet_ntoa(temp), (unsigned)server_config.conflict_time); 113 add_lease(blank_chaddr, addr, server_config.conflict_time); 114 return 0; 120 115 } 121 116 122 117 123 /* find an assignable address, i tcheck_expired is true, we check all the expired leases as well.118 /* find an assignable address, if check_expired is true, we check all the expired leases as well. 124 119 * Maybe this should try expired leases by age... */ 125 120 uint32_t find_address(int check_expired) … … 128 123 struct dhcpOfferedAddr *lease = NULL; 129 124 130 addr = ntohl(server_config.start); /* addr is in host order here */ 131 for (;addr <= ntohl(server_config.end); addr++) { 132 125 addr = server_config.start_ip; /* addr is in host order here */ 126 for (; addr <= server_config.end_ip; addr++) { 133 127 /* ie, 192.168.55.0 */ 134 if (!(addr & 0xFF)) continue;135 128 if (!(addr & 0xFF)) 129 continue; 136 130 /* ie, 192.168.55.255 */ 137 if ((addr & 0xFF) == 0xFF) continue; 138 139 /* Only do if it isn't an assigned as a static lease */ 140 if(!reservedIp(server_config.static_leases, htonl(addr))) 141 { 142 143 /* lease is not taken */ 131 if ((addr & 0xFF) == 0xFF) 132 continue; 133 /* Only do if it isn't assigned as a static lease */ 144 134 ret = htonl(addr); 145 if ( (!(lease = find_lease_by_yiaddr(ret)) ||146 147 /* or it expired and we are checking for expired leases */148 (check_expired && lease_expired(lease))) &&149 150 /* and it isn'ton the network */151 !check_ip(ret)) {152 return ret;153 break;135 if (!reservedIp(server_config.static_leases, ret)) { 136 /* lease is not taken */ 137 lease = find_lease_by_yiaddr(ret); 138 /* no lease or it expired and we are checking for expired leases */ 139 if ((!lease || (check_expired && lease_expired(lease))) 140 && nobody_responds_to_arp(ret) /* it isn't used on the network */ 141 ) { 142 return ret; 143 } 154 144 } 155 }156 145 } 157 146 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.