diff --git a/dhcp_tools/main.h b/dhcp_tools/main.h index c75f777..f21d7ed 100644 --- a/dhcp_tools/main.h +++ b/dhcp_tools/main.h @@ -53,6 +53,7 @@ typedef enum { typedef struct { U8 *p; int buf_size; + unsigned int tm; } BUF_INFO, *PBUF_INFO; typedef struct { diff --git a/dhcp_tools/main_wnd.c b/dhcp_tools/main_wnd.c index 47b81b6..ef621fa 100644 --- a/dhcp_tools/main_wnd.c +++ b/dhcp_tools/main_wnd.c @@ -9,7 +9,10 @@ #include "zlog_module.h" #include "dhcp_network.h" -#define ZLOG_CFG_PATH "./config/zlog.conf" +#define MAIN_WND_WIDTH (1024) +#define MAIN_WND_HEIGHT (768) + +#define ZLOG_CFG_PATH "./config/zlog.conf" static GtkBuilder *g_mainBuilder = NULL; static PDHCP_INFO g_pDhcpInfo = NULL; @@ -53,7 +56,7 @@ static double calc_total_progress(PDHCP_INFO pInfo) { pre_cnt += pInfo->step * 20; pre_cnt += pInfo->status * 5; - return pre_cnt; + return MIN(pre_cnt, 100.0); } static gboolean calc_step_progress(PDHCP_INFO pInfo, DHCP_STEP step) { @@ -64,32 +67,37 @@ static gboolean calc_step_progress(PDHCP_INFO pInfo, DHCP_STEP step) { return FALSE; } -void view_popup_menu_onDoSomething(GtkWidget *menuitem, gpointer userdata) { - PDHCP_INFO pInfo = (PDHCP_INFO)userdata; +void view_popup_menu_onStatistics(GtkWidget *UNUSED(menuitem), gpointer UNUSED(userdata)) { +} + +void view_popup_menu_onBinaryPkg(GtkWidget *UNUSED(menuitem), gpointer userdata) { + PDHCP_INFO pInfo = (PDHCP_INFO)userdata; //GtkWidget *deatilWnd = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "wndDetails")); // - g_print("Do something of %s\n", pInfo->treeId); + //g_print("Do something of %s\n", pInfo->treeId); //gtk_notebook_set_current_page(GTK_NOTEBOOK(tab), 0); //gtk_widget_show(deatilWnd); details_wnd_show(pInfo); } -void view_popup_menu(GtkWidget *treeview, GdkEventButton *event, gpointer userdata) { +void view_popup_menu(GtkWidget *UNUSED(treeview), GdkEventButton *event, gpointer userdata) { GtkWidget *menu, *menuitem; menu = gtk_menu_new(); - menuitem = gtk_menu_item_new_with_label("详细信息"); - - g_signal_connect(menuitem, "activate", (GCallback)view_popup_menu_onDoSomething, userdata); + menuitem = gtk_menu_item_new_with_label("数据包详情"); + g_signal_connect(menuitem, "activate", (GCallback)view_popup_menu_onBinaryPkg, userdata); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + menuitem = gtk_menu_item_new_with_label("统计信息"); + g_signal_connect(menuitem, "activate", (GCallback)view_popup_menu_onStatistics, userdata); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show_all(menu); gtk_menu_popup_at_pointer(GTK_MENU(menu), (GdkEvent *)event); } -gboolean view_onButtonPressed(GtkWidget *treeview, GdkEventButton *event, gpointer userdata) { +gboolean view_onButtonPressed(GtkWidget *treeview, GdkEventButton *event, gpointer UNUSED(userdata)) { gboolean showMenu = FALSE; PDHCP_INFO p = NULL; @@ -299,7 +307,7 @@ static gboolean tree_view_data_store_upgade(gpointer pInfo) { return TRUE; } -static void mainWnd_on_destroy(GObject *object, gpointer user_data) { +static void mainWnd_on_destroy(GObject *UNUSED(object), gpointer UNUSED(user_data)) { task_manager_exit(); g_thread_unref(g_pEvLoopThread); gtk_main_quit(); @@ -327,7 +335,7 @@ int cacheDhcpAckBuffer(PDHCP_INFO pInfo, U8 *pBuf, int size) { return -ERR_MALLOC_MEMORY; } -_Noreturn static void *dhcpThreadCb(void *pData) { +_Noreturn static void *dhcpThreadCb(void *UNUSED(pData)) { U8 *pkg; int size = 0; PDHCP_INFO pInfo, pTemp; @@ -347,6 +355,7 @@ _Noreturn static void *dhcpThreadCb(void *pData) { pInfo->pDiscBuf.buf_size = size; pInfo->step = STEP_DISCOVER; pInfo->status = STA_WAIT_START; + pInfo->pDiscBuf.tm = time(NULL); g_idle_add(tree_view_data_store_upgade, pInfo); } break; @@ -372,6 +381,7 @@ _Noreturn static void *dhcpThreadCb(void *pData) { pInfo->pReqBuf.buf_size = size; pInfo->step = STEP_REQUEST; pInfo->status = STA_WAIT_START; + pInfo->pReqBuf.tm = time(NULL); g_idle_add(tree_view_data_store_upgade, pInfo); } } @@ -391,6 +401,7 @@ _Noreturn static void *dhcpThreadCb(void *pData) { } break; case STEP_ACK: + pInfo->step = STEP_END; break; case STEP_END: break; @@ -426,7 +437,7 @@ static void cleanupDHCPInfo() { } } -static void mainWnd_on_tb_start(GObject *object, gpointer user_data) { +static void mainWnd_on_tb_start(GObject *object, gpointer UNUSED(user_data)) { int i, j, index = 0; GtkTreeIter iter; PDHCP_INFO pInfo; @@ -494,17 +505,42 @@ static void mainWnd_on_tb_start(GObject *object, gpointer user_data) { g_runTask = TRUE; } -static void mainWnd_on_tb_stop(GObject *object, gpointer user_data) { +static void mainWnd_on_tb_stop(GObject *object, gpointer UNUSED(user_data)) { GtkWidget *startButton = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "tbStart")); GtkWidget *nicSelect = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "cbNicName")); + GtkWidget *tbExpand = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "tbExpand")); g_runTask = FALSE; gtk_widget_set_sensitive(GTK_WIDGET(object), FALSE); gtk_widget_set_sensitive(startButton, TRUE); gtk_widget_set_sensitive(nicSelect, TRUE); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(tbExpand), FALSE); + g_object_set(G_OBJECT(tbExpand), "stock_id", "gtk-indent", NULL); } -static void *uv_loop_thread(void *pData) { +static void mainWnd_on_tb_expand(GObject *object, gpointer UNUSED(user_data)) { + GtkWidget *view = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "treeResult")); + if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(object))) { + gtk_tree_view_expand_all(GTK_TREE_VIEW(view)); + g_object_set(object, "stock_id", "gtk-unindent", NULL); + } else { + gtk_tree_view_collapse_all(GTK_TREE_VIEW(view)); + g_object_set(object, "stock_id", "gtk-indent", NULL); + } +} + +static void mainWnd_on_tb_cleanup(GObject *UNUSED(object), gpointer UNUSED(user_data)) { + GtkWidget *view = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "treeResult")); + GtkTreeStore *store = GTK_TREE_STORE(gtk_builder_get_object(g_mainBuilder, "tsDhcpInfo")); + GtkWidget *tbStop = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "tbStop")); + gtk_tree_view_set_model(GTK_TREE_VIEW(view), NULL); + gtk_tree_store_clear(store); + cleanupDHCPInfo(); + + mainWnd_on_tb_stop(G_OBJECT(tbStop), NULL); +} + +static void *uv_loop_thread(void *UNUSED(pData)) { task_manager_run(); return NULL; } @@ -540,6 +576,12 @@ int main(int args, char **argv) { GtkWidget *tbStop = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "tbStop")); g_signal_connect(tbStop, "clicked", G_CALLBACK(mainWnd_on_tb_stop), g_mainBuilder); + GtkWidget *tbExpand = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "tbExpand")); + g_signal_connect(tbExpand, "clicked", G_CALLBACK(mainWnd_on_tb_expand), g_mainBuilder); + + GtkWidget *tbClean = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "tbCleanup")); + g_signal_connect(tbClean, "clicked", G_CALLBACK(mainWnd_on_tb_cleanup), g_mainBuilder); + GtkWidget *cbNic = GTK_WIDGET(gtk_builder_get_object(g_mainBuilder, "cbNicName")); for (i = 0; i < info.nicCnt; i++) { GtkListStore *store = GTK_LIST_STORE(gtk_builder_get_object(g_mainBuilder, "lsNicName")); @@ -586,6 +628,14 @@ int main(int args, char **argv) { G_TYPE_FLOAT); #endif + GdkDisplay *display = gdk_display_get_default(); + GdkMonitor *monitor = gdk_display_get_primary_monitor(display); + GdkRectangle rect; + gdk_monitor_get_geometry(monitor, &rect); + + gtk_widget_set_size_request(mainWnd, MAIN_WND_WIDTH, MAIN_WND_HEIGHT); // 设置窗口的最小大小 + gtk_window_move(GTK_WINDOW(mainWnd), (rect.width - MAIN_WND_WIDTH) / 2, (rect.height - MAIN_WND_HEIGHT) / 2); + gtk_builder_connect_signals(g_mainBuilder, NULL); gtk_widget_show(mainWnd); diff --git a/dhcp_tools/res/main.glade b/dhcp_tools/res/main.glade index f66ca34..ce3b076 100644 --- a/dhcp_tools/res/main.glade +++ b/dhcp_tools/res/main.glade @@ -38,6 +38,7 @@ 1024 + 768 True @@ -187,7 +188,7 @@ True True - Start + 开始 True gtk-media-play @@ -201,7 +202,7 @@ True False True - Stop + 停止 gtk-media-stop @@ -209,6 +210,48 @@ True + + + True + + + False + True + + + + + True + 展开 + True + gtk-unindent + + + False + True + + + + + True + 清除 + True + gtk-delete + + + False + True + + + + + True + + + False + True + + False diff --git a/dhcp_tools/uv_rawsocket.c b/dhcp_tools/uv_rawsocket.c index cf42b57..c8db6f7 100644 --- a/dhcp_tools/uv_rawsocket.c +++ b/dhcp_tools/uv_rawsocket.c @@ -154,7 +154,6 @@ U8 *dhcp_create_discover_req(PDHCP_INFO pInfo, int *pOutSize) { static void on_dhcp_recv(uv_work_t *req) { PDHCP_INFO pInfo; - U32 ip; DHCP_RSP rspDhcp; DHCP_OPT optMsg, opt; int ret; @@ -230,6 +229,7 @@ static void on_dhcp_recv(uv_work_t *req) { cacheDhcpOfferBuffer(pInfo, pWork->pPkgBase, pWork->nSize); memcpy(&pInfo->offerRsp, &rspDhcp, sizeof(DHCP_RSP)); + pInfo->pOfferBuf.tm = time(NULL); break; case DHCP_MSG_ACK: pInfo->step = STEP_ACK; @@ -237,6 +237,7 @@ static void on_dhcp_recv(uv_work_t *req) { cacheDhcpAckBuffer(pInfo, pWork->pPkgBase, pWork->nSize); memcpy(&pInfo->ackRsp, &rspDhcp, sizeof(DHCP_RSP)); + pInfo->pAckBuf.tm = time(NULL); break; case DHCP_MSG_NAK: break; @@ -244,10 +245,7 @@ static void on_dhcp_recv(uv_work_t *req) { } int dhcp_tools_init_network(const char *pNicName) { - static RECV_CB_DATA rcData; - static uv_poll_t uvSocket; - static uv_timer_t uvTm; - int ret; + int ret; if (g_pNicName == NULL) { g_pNicName = strdup(pNicName); diff --git a/srcs/service/dhcpd/dhcpd_network.c b/srcs/service/dhcpd/dhcpd_network.c index 1dd48c5..8e43239 100644 --- a/srcs/service/dhcpd/dhcpd_network.c +++ b/srcs/service/dhcpd/dhcpd_network.c @@ -562,6 +562,7 @@ static void on_sock_recv(uv_work_t *req) { if (ret == ERR_SUCCESS) { LOG_MOD(debug, ZM_DHCP_NET, "User %u DHCP prepare assign ipaddress: [%s(%s)] --> %s\n", reqDhcp.uid, macStr, reqDhcp.hostName, u32_to_str_ip(ntohl(reqDhcp.cliAddr))); + // 可以向客户端回复租约信息 } else { LOG_MOD(error, ZM_DHCP_NET, "DHCP prepare assign ipaddress error: User %u [%s(%s)] resion %s\n", reqDhcp.uid, macStr, reqDhcp.hostName, getErrorEnumNameString(ret));