diff --git a/srcs/libs/database/database.c b/srcs/libs/database/database.c index f0e6937..1d12c63 100644 --- a/srcs/libs/database/database.c +++ b/srcs/libs/database/database.c @@ -8,6 +8,7 @@ #include "user_errno.h" #include "config.h" #include "database.h" +#include "common.h" static sqlite3 *g_pSqlHandle = NULL; @@ -57,6 +58,7 @@ int db_sqlite3_sql_exec(const char *pSqlCmd, void *pCallback, void *pData, char void db_sqlite3_uninit() { if (g_pSqlHandle) { + DEBUG_CODE_LINE(); sqlite3_close(g_pSqlHandle); } } diff --git a/srcs/libs/init/init_runtime.c b/srcs/libs/init/init_runtime.c index e974c6d..1cf2cf3 100644 --- a/srcs/libs/init/init_runtime.c +++ b/srcs/libs/init/init_runtime.c @@ -56,7 +56,8 @@ int user_init(const char *pAppCfgFile, const char *pCfgDirectory, const char *pK signal(SIGQUIT, catch_system_interupt); signal(SIGTSTP, catch_system_interupt); signal(SIGHUP, catch_system_interupt); - signal(SIGPIPE, SIG_IGN); + signal(SIGPIPE, catch_system_interupt); + signal(SIGKILL, catch_system_interupt); // 初始化 libuv loop get_task_manager(); diff --git a/srcs/service/dhcpd/dhcpd_network.c b/srcs/service/dhcpd/dhcpd_network.c index 1887b6e..37bd2ce 100644 --- a/srcs/service/dhcpd/dhcpd_network.c +++ b/srcs/service/dhcpd/dhcpd_network.c @@ -333,6 +333,7 @@ static void on_sock_recv(uv_work_t *req) { memset(&reqDhcp, 0, sizeof(DHCP_REQ)); reqDhcp.unicast = pkg->dhcp.flags != 0 ? TRUE : FALSE; reqDhcp.xid = DHCP_XID(pkg->dhcp.xid); + reqDhcp.uid = VLAN_VNI_ID(pkg->vlan_hdr.vlan.id); memcpy(reqDhcp.cliMac, pkg->dhcp.chaddr, ETH_ALEN); switch (*optMsg.pValue) { @@ -363,7 +364,7 @@ static void on_sock_recv(uv_work_t *req) { } MAC_TO_STR(reqDhcp.cliMac, macStr); - ret = pre_alloc_dhcp_res(VLAN_VNI_ID(pkg->vlan_hdr.vlan.id), macStr, &ip, &pIpInfo); + ret = pre_alloc_dhcp_res(&reqDhcp, &ip, &pIpInfo); if (ret == ERR_SUCCESS) { LOG_MOD(trace, @@ -506,7 +507,7 @@ int create_udp_raw_socket(const char *pNicName) { // 1. create socket int sock_fd = socket(PF_PACKET, SOCK_RAW, 0); if (sock_fd < 0) { - LOG_MOD(error, ZLOG_MOD_DHCPD, "Socket created failure\n"); + LOG_MOD(error, ZLOG_MOD_DHCPD, "Socket created failure: %s --> %s\n", pNicName, strerror(errno)); return -ERR_SOCK_CREATE; } diff --git a/srcs/service/dhcpd/include/ip_pool.h b/srcs/service/dhcpd/include/ip_pool.h index dd957f9..724d251 100644 --- a/srcs/service/dhcpd/include/ip_pool.h +++ b/srcs/service/dhcpd/include/ip_pool.h @@ -32,6 +32,7 @@ typedef struct { UT_hash_handle hh; } IPPOOL_INFO, *PIPPOOL_INFO; + void init_default_pool(); #ifdef __cplusplus } diff --git a/srcs/service/dhcpd/include/lease.h b/srcs/service/dhcpd/include/lease.h index bda166b..9d8b160 100644 --- a/srcs/service/dhcpd/include/lease.h +++ b/srcs/service/dhcpd/include/lease.h @@ -8,6 +8,7 @@ #include #include #include "ip_pool.h" +#include "rfc2131.h" #ifdef __cplusplus extern "C" { #endif @@ -26,7 +27,8 @@ typedef struct { } LEASE_CACHE, *PLEASE_CACHE; int dhcp_lease_init(); -int pre_alloc_dhcp_res(U32 uid, const char *pMac, U32 *pOutIp, PIPPOOL_INFO *pOutPool); +//int pre_alloc_dhcp_res(U32 uid, const char *pMac, U32 *pOutIp, PIPPOOL_INFO *pOutPool); +int pre_alloc_dhcp_res(PDHCP_REQ pReq, U32 *pOutIp, PIPPOOL_INFO *pOutPool); #ifdef __cplusplus } #endif diff --git a/srcs/service/dhcpd/include/rfc2131.h b/srcs/service/dhcpd/include/rfc2131.h index 64ce1c2..226a9a8 100644 --- a/srcs/service/dhcpd/include/rfc2131.h +++ b/srcs/service/dhcpd/include/rfc2131.h @@ -21,6 +21,7 @@ extern "C" { typedef struct { U8 unicast; U8 cliMac[ETH_ALEN]; + U32 uid; U32 xid; U32 reqIpAddr; U32 leaseTime; diff --git a/srcs/service/dhcpd/lease.c b/srcs/service/dhcpd/lease.c index 4a67004..1588cd3 100644 --- a/srcs/service/dhcpd/lease.c +++ b/srcs/service/dhcpd/lease.c @@ -8,13 +8,15 @@ #include "zlog_module.h" #include "database.h" #include "user_mgr.h" +#include "rfc2131.h" +#include "dhcp_network.h" -#define LEASE_DB_NAME ("lease") +#define LEASE_DB_NAME "lease" #define PREALLOC_IP_TIMEOUT (60) typedef struct { U32 ipAddr; - char macAddr[20]; + U8 macAddr[ETH_ALEN]; U32 bitset; PIPPOOL_INFO pCtx; U32 timeStamp; @@ -25,8 +27,8 @@ typedef struct { //static PMAC_FILTER g_blackListTbl = NULL; static PPRE_ALLOC_IP g_pPreAllocIp = NULL; -#define CREATE_LEASE_TABLE(name) \ - "CREATE TABLE IF NOT EXISTS " #name \ +#define CREATE_LEASE_TABLE() \ + "CREATE TABLE IF NOT EXISTS lease " \ " ( id INTEGER PRIMARY KEY AUTOINCREMENT," \ " uid INTEGER NOT NULL," \ " mac CHAR(20) NOT NULL," \ @@ -41,19 +43,71 @@ static PPRE_ALLOC_IP g_pPreAllocIp = NULL; " hostname CHAR(64) DEFAULT '' NOT NULL," \ " keyType INTEGER NOT NULL" \ ");" \ - "CREATE INDEX IF NOT EXISTS " #name "_index ON " #name " (uid, mac);" + "CREATE INDEX IF NOT EXISTS " \ + "lease_index ON lease (uid, mac);" -int pre_alloc_dhcp_res(U32 uid, const char *pMac, U32 *pOutIp, PIPPOOL_INFO *pOutPool) { +#define CREATE_PRE_ASSIGN_TABLE() \ + "CREATE TABLE IF NOT EXISTS pre_assign" \ + " ( id INTEGER PRIMARY KEY AUTOINCREMENT," \ + " uid INTEGER NOT NULL," \ + " xid INTEGER NOT NULL," \ + " hostname CHAR(64) DEFAULT '' NOT NULL," \ + " mac CHAR(20) NOT NULL," \ + " ip INTEGER NOT NULL," \ + " lease INTEGER NOT NULL," \ + " netmask INTEGER," \ + " gateway INTEGER," \ + " dns1 INTEGER," \ + " dns2 INTEGER," \ + " createTm TIMESTAMP DEFAULT (datetime('now', 'localtime')) NOT NULL" \ + "); CREATE INDEX IF NOT EXISTS pre_assign_index ON pre_assign(ip, uid);" + +#define INSERT_PRE_ASSIGN_ROW_FMT \ + "INSERT INTO pre_assign (uid, xid, hostname, mac, ip, lease, netmask, gateway, dns1, dns2) " \ + "VALUES (%d, %d, \'%s\', \'%s\', %d, %d, %d, %d, %d, %d);" + +static int lease_db_add_pre_assign(PDHCP_REQ pReq, U32 ip, PIPPOOL_INFO pPool) { + int rc; + char buf[1024] = {0}; + char macStr[20] = {0}; + + MAC_TO_STR(pReq->cliMac, macStr); + snprintf(buf, + 1024, + INSERT_PRE_ASSIGN_ROW_FMT, + pReq->uid, + pReq->xid, + pReq->hostName, + macStr, + ip, + pPool->leaseTime, + pPool->netMask, + pPool->gwAddr, + pPool->primeDNS, + pPool->salveDNS); + + rc = db_sqlite3_sql_exec(CREATE_PRE_ASSIGN_TABLE(), NULL, NULL, NULL); + + if (rc != ERR_SUCCESS) { + return rc; + } + + DEBUG_CODE_LINE(); + return ERR_SUCCESS; +} + +//int pre_alloc_dhcp_res(U32 uid, const char *pMac, U32 *pOutIp, PIPPOOL_INFO *pOutPool) { +int pre_alloc_dhcp_res(PDHCP_REQ pReq, U32 *pOutIp, PIPPOOL_INFO *pOutPool) { PIPPOOL_INFO pPool, pTemp; PPRE_ALLOC_IP pNewIp, pTmp, pCache = NULL; PIPPOOL_INFO pUserPool; - if (pOutIp == NULL || pOutPool == NULL) { + if (pReq == NULL || pOutIp == NULL || pOutPool == NULL) { LOG_MOD(error, ZLOG_MOD_DHCPD, "Input params error: %p, %p\n", pOutIp, pOutPool); return -ERR_INPUT_PARAMS; } - pUserPool = user_get_pool(uid); + pUserPool = user_get_pool(pReq->uid); if (pUserPool == NULL) { LOG_MOD(error, ZLOG_MOD_DHCPD, "Can't found avaliable address pool\n"); return -ERR_DHCP_NO_POOL; @@ -64,6 +118,7 @@ int pre_alloc_dhcp_res(U32 uid, const char *pMac, U32 *pOutIp, PIPPOOL_INFO *pOu U32 addr; // 查看是否预分配过该设备 +#if 0 if (pMac && strlen(pMac) > 0) { HASH_ITER(hh, g_pPreAllocIp, pNewIp, pTmp) { if (strcmp(pNewIp->macAddr, pMac) == 0) { @@ -74,7 +129,7 @@ int pre_alloc_dhcp_res(U32 uid, const char *pMac, U32 *pOutIp, PIPPOOL_INFO *pOu } } } - +#endif while ((addr = bitset_minimum(pPool->assignPool)) > 0) { U32 ipAddr = (pPool->minAddr & pPool->netMask) + addr; @@ -102,11 +157,11 @@ int pre_alloc_dhcp_res(U32 uid, const char *pMac, U32 *pOutIp, PIPPOOL_INFO *pOu pNewIp->pCtx = pPool; pNewIp->ipAddr = ipAddr; pNewIp->bitset = addr; - if (pMac) { - strcpy(pNewIp->macAddr, pMac); - } + memcpy(pNewIp->macAddr, pReq->cliMac, ETH_ALEN); - HASH_ADD_INT(g_pPreAllocIp, ipAddr, pNewIp); + //HASH_ADD_INT(g_pPreAllocIp, ipAddr, pNewIp); + DEBUG_CODE_LINE(); + lease_db_add_pre_assign(pReq, ipAddr, pPool); *pOutIp = ipAddr; *pOutPool = pPool; @@ -116,6 +171,7 @@ int pre_alloc_dhcp_res(U32 uid, const char *pMac, U32 *pOutIp, PIPPOOL_INFO *pOu LOG_MOD(trace, ZLOG_MOD_DHCPD, "Select ipaddr %08X at %d of %p\n", ipAddr, addr, pPool->assignPool); return ERR_SUCCESS; } else { + DEBUG_CODE_LINE(); if (time(NULL) - pNewIp->timeStamp < PREALLOC_IP_TIMEOUT) { continue; } @@ -155,14 +211,24 @@ int pre_alloc_dhcp_res(U32 uid, const char *pMac, U32 *pOutIp, PIPPOOL_INFO *pOu } // 没有可预分配的IP,报错 - LOG_MOD(error, ZLOG_MOD_DHCPD, "No free ipaddress in poll: uid = %u, pool = 0x%08X\n", uid, pUserPool->poolKey); + LOG_MOD(error, + ZLOG_MOD_DHCPD, + "No free ipaddress in poll: uid = %u, pool = 0x%08X\n", + pReq->uid, + pUserPool->poolKey); return -ERR_DHCP_NO_ADDR; } int dhcp_lease_init() { int rc = 0; - rc = db_sqlite3_sql_exec(CREATE_LEASE_TABLE(LEASE_DB_NAME), NULL, NULL, NULL); + rc = db_sqlite3_sql_exec(CREATE_LEASE_TABLE(), NULL, NULL, NULL); + + if (rc != ERR_SUCCESS) { + return rc; + } + + rc = db_sqlite3_sql_exec(CREATE_PRE_ASSIGN_TABLE(), NULL, NULL, NULL); if (rc != ERR_SUCCESS) { return rc;