From: Vlad S. <ser...@us...> - 2006-10-10 22:58:22
|
Update of /cvsroot/naviserver/modules/nsdhcpd In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv3521/nsdhcpd Modified Files: nsdhcpd.c Log Message: Still dhcp server updates and development Index: nsdhcpd.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsdhcpd/nsdhcpd.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** nsdhcpd.c 9 Oct 2006 21:55:46 -0000 1.5 --- nsdhcpd.c 10 Oct 2006 22:58:19 -0000 1.6 *************** *** 257,260 **** --- 257,261 ---- u_int8_t msgtype; DHCPRange *range; + char macaddr[13]; struct { u_int8_t msgtype; *************** *** 295,302 **** static DHCPRange *DHCPRangeFind(DHCPRequest *req); static DHCPRange *DHCPRangeFindFast(DHCPServer *srvPtr, u_int32_t ipaddr); - static int DHCPRangeAlloc(DHCPRequest *req); static void DHCPRangeFree(DHCPRange *range); static DHCPLease *DHCPLeaseCreate(u_int32_t ipaddr, char *macaddr, u_int32_t lease_time, u_int32_t expires); static DHCPLease *DHCPLeaseFind(DHCPRange *range, u_int32_t ipaddr, char *macaddr); static int DHCPLeaseAdd(DHCPServer *srvPtr, u_int32_t ipaddr, char *macaddr, u_int32_t lease_time, u_int32_t expires); static void DHCPLeaseDel(DHCPServer *srvPtr, u_int32_t ipaddr); --- 296,303 ---- static DHCPRange *DHCPRangeFind(DHCPRequest *req); static DHCPRange *DHCPRangeFindFast(DHCPServer *srvPtr, u_int32_t ipaddr); static void DHCPRangeFree(DHCPRange *range); static DHCPLease *DHCPLeaseCreate(u_int32_t ipaddr, char *macaddr, u_int32_t lease_time, u_int32_t expires); static DHCPLease *DHCPLeaseFind(DHCPRange *range, u_int32_t ipaddr, char *macaddr); + static DHCPLease *DHCPLeaseAlloc(DHCPRange *range); static int DHCPLeaseAdd(DHCPServer *srvPtr, u_int32_t ipaddr, char *macaddr, u_int32_t lease_time, u_int32_t expires); static void DHCPLeaseDel(DHCPServer *srvPtr, u_int32_t ipaddr); *************** *** 1323,1326 **** --- 1324,1328 ---- req = ns_calloc(1, sizeof(DHCPRequest)); memcpy(&req->in, buffer, size); + bin2hex(req->macaddr, req->in.macaddr, 6); req->sock = dup(sock); req->srvPtr = srvPtr; *************** *** 1448,1452 **** default: ! Ns_Log(Debug, "nsdhcpd: unsupported msg type (%d) %s -- ignoring", req->msgtype, bin2hex(req->buffer, req->in.macaddr, 6)); } return NS_TRUE; --- 1450,1454 ---- default: ! Ns_Log(Debug, "nsdhcpd: unsupported msg type (%d) %s -- ignoring", req->msgtype, req->macaddr); } return NS_TRUE; *************** *** 1716,1725 **** static void DHCPProcessDiscover(DHCPRequest *req) { ! req->range = DHCPRangeFind(req); ! if (req->range == NULL || !DHCPRangeAlloc(req)) { ! DHCPSendNAK(req); return; } DHCPSend(req, DHCP_OFFER); } --- 1718,1735 ---- static void DHCPProcessDiscover(DHCPRequest *req) { ! DHCPLease *lease; ! req->range = DHCPRangeFind(req); ! if (req->range == NULL || ! (!(lease = DHCPLeaseFind(req->range, 0, req->macaddr)) && ! !(lease = DHCPLeaseAlloc(req->range)))) { return; } + // Make it short till next REQUEST packet + req->reply.lease_time = 60; + lease->expires = time(0) + 60; + strcpy(lease->macaddr, req->macaddr); + + req->reply.yiaddr = lease->ipaddr; DHCPSend(req, DHCP_OFFER); } *************** *** 1727,1730 **** --- 1737,1751 ---- static void DHCPProcessRequest(DHCPRequest *req) { + DHCPLease *lease; + + req->range = DHCPRangeFind(req); + if (req->range == NULL || !(lease = DHCPLeaseFind(req->range, req->in.ciaddr, req->macaddr))) { + DHCPSendNAK(req); + return; + } + // Make normal lease time + req->reply.lease_time = lease->lease_time; + lease->expires = time(0) + lease->lease_time; + req->reply.yiaddr = req->in.yiaddr; req->reply.siaddr = req->in.siaddr; *************** *** 1734,1737 **** --- 1755,1763 ---- static void DHCPProcessInform(DHCPRequest *req) { + req->range = DHCPRangeFind(req); + if (req->range == NULL) { + return; + } + req->reply.yiaddr = req->in.yiaddr; req->reply.siaddr = req->in.siaddr; *************** *** 1769,1780 **** lease = (DHCPLease*)ns_calloc(1, sizeof(DHCPLease)); - memcpy(lease->macaddr, macaddr, 12); lease->ipaddr = ipaddr; lease->expires = expires; lease->lease_time = lease_time; Ns_Log(Notice, "LeaseCreate: %s %s %u", addr2str(ipaddr), macaddr, lease_time); return lease; } static DHCPLease *DHCPLeaseFind(DHCPRange *range, u_int32_t ipaddr, char *macaddr) { --- 1795,1835 ---- lease = (DHCPLease*)ns_calloc(1, sizeof(DHCPLease)); lease->ipaddr = ipaddr; lease->expires = expires; lease->lease_time = lease_time; + if (macaddr != NULL) { + memcpy(lease->macaddr, macaddr, 12); + } Ns_Log(Notice, "LeaseCreate: %s %s %u", addr2str(ipaddr), macaddr, lease_time); return lease; } + static DHCPLease *DHCPLeaseAlloc(DHCPRange *range) + { + u_int32_t n, ipaddr; + Tcl_HashEntry *entry; + DHCPLease *lease = NULL; + + Ns_MutexLock(&range->lock); + for (ipaddr = range->start; ipaddr <= range->end; ipaddr++) { + entry = Tcl_FindHashEntry(&range->leases, (char *)ipaddr); + if (entry != NULL) { + if (lease->expires < time(0)) { + ns_free(Tcl_GetHashValue(entry)); + Tcl_DeleteHashEntry(entry); + entry = NULL; + } + } + if (entry == NULL) { + lease = DHCPLeaseCreate(ipaddr, NULL, range->lease_time, time(0) + range->lease_time); + entry = Tcl_CreateHashEntry(&range->leases, (char*)lease->ipaddr, (int*)&n); + Tcl_SetHashValue(entry, (ClientData)lease); + break; + } + } + Ns_MutexUnlock(&range->lock); + return lease; + } + static DHCPLease *DHCPLeaseFind(DHCPRange *range, u_int32_t ipaddr, char *macaddr) { *************** *** 1784,1795 **** Ns_MutexLock(&range->lock); ! entry = Tcl_FirstHashEntry(&range->leases, &search); ! while (entry) { ! lease = (DHCPLease*)Tcl_GetHashValue(entry); ! if ((ipaddr && ipaddr == lease->ipaddr) || ! (*macaddr && !memcmp(macaddr, lease->macaddr, 12))) { ! break; } - entry = Tcl_NextHashEntry(&search); } Ns_MutexUnlock(&range->lock); --- 1839,1855 ---- Ns_MutexLock(&range->lock); ! if (macaddr == NULL) { ! entry = Tcl_FindHashEntry(&range->leases, (char*)ipaddr); ! ! } else { ! entry = Tcl_FirstHashEntry(&range->leases, &search); ! while (entry) { ! lease = (DHCPLease*)Tcl_GetHashValue(entry); ! if ((ipaddr && ipaddr == lease->ipaddr) || ! (*macaddr && !memcmp(macaddr, lease->macaddr, 12))) { ! break; ! } ! entry = Tcl_NextHashEntry(&search); } } Ns_MutexUnlock(&range->lock); *************** *** 1874,1886 **** static DHCPRange *DHCPRangeFind(DHCPRequest *req) { ! char rc, buf[32]; DHCPRange *range; DHCPOption *opt, option; - bin2hex(buf, req->in.macaddr, 6); Ns_MutexLock(&req->srvPtr->lock); for (range = req->srvPtr->ranges; range; range = range->next) { if ((req->in.yiaddr && req->in.yiaddr >= range->start && req->in.yiaddr <= range->end) || ! (range->macaddr[0] && !memcmp(buf, range->macaddr, 12))) { for (opt = range->check; opt; opt = opt->next) { --- 1934,1945 ---- static DHCPRange *DHCPRangeFind(DHCPRequest *req) { ! char rc; DHCPRange *range; DHCPOption *opt, option; Ns_MutexLock(&req->srvPtr->lock); for (range = req->srvPtr->ranges; range; range = range->next) { if ((req->in.yiaddr && req->in.yiaddr >= range->start && req->in.yiaddr <= range->end) || ! (range->macaddr[0] && !memcmp(req->macaddr, range->macaddr, 12))) { for (opt = range->check; opt; opt = opt->next) { *************** *** 1928,1962 **** } - static int DHCPRangeAlloc(DHCPRequest *req) - { - char buf[32]; - u_int32_t n, ipaddr; - Tcl_HashEntry *entry; - DHCPLease *lease = NULL; - - Ns_MutexLock(&req->range->lock); - for (ipaddr = req->range->start; ipaddr <= req->range->end; ipaddr++) { - entry = Tcl_FindHashEntry(&req->range->leases, (char *)ipaddr); - if (entry != NULL) { - if (lease->expires < time(0)) { - ns_free(Tcl_GetHashValue(entry)); - Tcl_DeleteHashEntry(entry); - entry = NULL; - } - } - if (entry == NULL) { - req->reply.yiaddr = ipaddr; - req->reply.lease_time = req->range->lease_time; - bin2hex(buf, req->in.macaddr, 6); - lease = DHCPLeaseCreate(ipaddr, buf, req->range->lease_time, time(0) + req->range->lease_time); - entry = Tcl_CreateHashEntry(&req->range->leases, (char*)lease->ipaddr, (int*)&n); - Tcl_SetHashValue(entry, (ClientData)lease); - break; - } - } - Ns_MutexUnlock(&req->range->lock); - return lease ? 1 : 0; - } - static void DHCPRangeFree(DHCPRange *range) { --- 1987,1990 ---- |