⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reply.c

📁 关于Linux下DHCP支持IPv6的版本实现
💻 C
字号:
#include "stdhead.h"#include "reply.h"#include "lib.h"struct OPTIONS * copy_ia_option (struct DHCP_MESSAGE * request_message, struct OPTIONS * opt_ptr){    struct IA *ia_ptr;    struct OPTIONS *options_ptr;        options_ptr = get_options_ptr (request_message, OPTION_IA);    if (!options_ptr)	return NULL;	    opt_ptr -> u_opt_code.opt_code = OPTION_IA;    opt_ptr -> u_opt_len.opt_len = options_ptr -> u_opt_len.opt_len;    ia_ptr = opt_ptr -> opt_data = (struct IA *) malloc (sizeof (struct IA));    ia_ptr -> u_iaid.iaid = ((struct IA *) options_ptr -> opt_data) -> u_iaid.iaid;    ia_ptr -> u_t1.t1 = ((struct IA *) options_ptr -> opt_data) -> u_t1.t1;    ia_ptr -> u_t2.t2 = ((struct IA *) options_ptr -> opt_data) -> u_t2.t2;    ia_ptr -> status = Success;    opt_ptr = ia_ptr -> opt = (struct OPTIONS *) malloc (sizeof (struct OPTIONS));    return opt_ptr;}void copy_iaaddr_option (struct DHCP_MESSAGE * request_message, struct OPTIONS * opt_ptr){    int i;    struct OPTIONS *options_ptr;    struct IA_ADDRESS *ia_addr_ptr;        options_ptr = get_options_ptr (request_message, OPTION_IAADDR);    if (!options_ptr)	return;	    opt_ptr -> u_opt_code.opt_code = OPTION_IAADDR;    opt_ptr -> u_opt_len.opt_len = options_ptr -> u_opt_len.opt_len;    ia_addr_ptr = opt_ptr -> opt_data = (struct IA_ADDRESS *) malloc (sizeof (struct IA_ADDRESS));    ia_addr_ptr -> t_bit = 0;    ia_addr_ptr -> addr_status = Success;    ia_addr_ptr -> prefix_length = ((struct IA_ADDRESS *) options_ptr -> opt_data) -> prefix_length;    for (i = 0; i < 16; i++)	ia_addr_ptr -> addr[i] = ((struct IA_ADDRESS *) options_ptr -> opt_data) -> addr[i];    ia_addr_ptr -> u_pref_lifetime.pref_lifetime = ((struct IA_ADDRESS *) options_ptr -> opt_data) -> u_pref_lifetime.pref_lifetime;    ia_addr_ptr -> u_valid_lifetime.valid_lifetime = ((struct IA_ADDRESS *) options_ptr -> opt_data) -> u_valid_lifetime.valid_lifetime;    ia_addr_ptr -> ia_addr_opt = 0;    ia_addr_ptr -> opt = 0;}struct DHCP_MESSAGE * create_reply_message (struct DHCP_MESSAGE *message){    struct DHCP_MESSAGE * dhcp_message_ptr = malloc (sizeof (struct DHCP_MESSAGE));    struct OPTIONS * opt_ptr;    // MESSAGE TYPE    dhcp_message_ptr->u_msg_type.msg_type = REPLY;    // Copy TRANSACTION ID from message    dhcp_message_ptr -> u_trans_id.trans_id = message -> u_trans_id.trans_id;    // ASSIGN MEMORY FOR OPTIONS    opt_ptr = dhcp_message_ptr->opt = (struct OPTIONS *) malloc (sizeof (struct OPTIONS));        // send SERVER Id option    opt_ptr = send_server_id (opt_ptr);        // copy IA option    opt_ptr = copy_ia_option (message, opt_ptr);        // copy IAADDR option    copy_iaaddr_option (message, opt_ptr);	    return dhcp_message_ptr;}struct DHCP_MESSAGE * create_reply_message_for_decline (struct DHCP_MESSAGE *decline_message){    struct DHCP_MESSAGE * dhcp_message_ptr;    struct OPTIONS *opt_ptr;    struct STATUS_CODE *sc_ptr;    struct DUID *duid_ptr;        // send Success status code option    dhcp_message_ptr = create_message_with_status_code (decline_message, REPLY, Success, "Decline message accepted");    // send server ID option    opt_ptr = (struct OPTIONS *) malloc (sizeof (struct OPTIONS));    sc_ptr = ((struct STATUS_CODE *) dhcp_message_ptr -> opt -> opt_data);    sc_ptr -> opt = opt_ptr;    opt_ptr = send_server_id (opt_ptr);    duid_ptr = (struct DUID *) sc_ptr -> opt -> opt_data;    safe_free (duid_ptr -> opt);    duid_ptr -> opt = 0;        return dhcp_message_ptr;}struct DHCP_MESSAGE * create_reply_message_for_release (struct DHCP_MESSAGE *release_message){    struct DHCP_MESSAGE * dhcp_message_ptr;    struct OPTIONS *opt_ptr;    struct STATUS_CODE *sc_ptr;    struct DUID *duid_ptr;        // send Success status code option    dhcp_message_ptr = create_message_with_status_code (release_message, REPLY, Success, "Release message accepted");    // send server ID option    opt_ptr = (struct OPTIONS *) malloc (sizeof (struct OPTIONS));    sc_ptr = ((struct STATUS_CODE *) dhcp_message_ptr -> opt -> opt_data);    sc_ptr -> opt = opt_ptr;    opt_ptr = send_server_id (opt_ptr);    duid_ptr = (struct DUID *) sc_ptr -> opt -> opt_data;    safe_free (duid_ptr -> opt);    duid_ptr -> opt = 0;            return dhcp_message_ptr;}struct DHCP_MESSAGE * create_dummy_reply_message (struct DHCP_MESSAGE *message){    struct DHCP_MESSAGE * dhcp_message_ptr = (struct DHCP_MESSAGE *) malloc (sizeof (struct DHCP_MESSAGE));    struct IA *ia_ptr, *ia_src_ptr;    struct IA_ADDRESS *iaaddr_ptr, *iaaddr_src_ptr;    struct OPTIONS *opt_ptr, *opt_src_ptr;    // MESSAGE TYPE    dhcp_message_ptr->u_msg_type.msg_type = REPLY;    // Copy TRANSACTION ID from message    dhcp_message_ptr -> u_trans_id.trans_id = message -> u_trans_id.trans_id;    // ASSIGN MEMORY FOR OPTIONS    opt_ptr = dhcp_message_ptr->opt = (struct OPTIONS *) malloc (sizeof (struct OPTIONS));        // send SERVER Id option    opt_ptr = send_server_id (opt_ptr);        // set IA option with values set to null (except iaid)    opt_src_ptr = get_options_ptr (message, OPTION_IA);    ia_src_ptr = (struct IA *) opt_src_ptr -> opt_data;        opt_ptr -> u_opt_code.opt_code = OPTION_IA;    opt_ptr -> u_opt_len.opt_len = opt_src_ptr -> u_opt_len.opt_len;    ia_ptr = (struct IA *) malloc (sizeof (struct IA));    opt_ptr -> opt_data = ia_ptr;    bzero (ia_ptr, sizeof (struct IA));    ia_ptr -> u_iaid.iaid = ia_src_ptr -> u_iaid.iaid;        // set IAADDR option with values set to null    opt_src_ptr = get_options_ptr (message, OPTION_IAADDR);    iaaddr_src_ptr = (struct IA_ADDRESS *) opt_src_ptr -> opt_data;        opt_ptr = ia_ptr -> opt = (struct OPTIONS *) malloc (sizeof (struct OPTIONS));    opt_ptr -> u_opt_code.opt_code = OPTION_IAADDR;    opt_ptr -> u_opt_len.opt_len = opt_src_ptr -> u_opt_len.opt_len;    iaaddr_ptr = (struct IA_ADDRESS *) malloc (sizeof (struct IA_ADDRESS));    opt_ptr -> opt_data = iaaddr_ptr;    bzero (iaaddr_ptr, sizeof (struct IA_ADDRESS));        return dhcp_message_ptr;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -