📄 dhcp.c
字号:
/*
********************************************************************************
File Include Section
********************************************************************************
*/
#include "71x_lib.h"
#include "socket.h"
#include "eeprom.h"
#include "util.h"
#include "w5100.h"
#include "netconfig.h"
#include "dhcp.h"
#include <stdio.h>
#include <string.h>
/*
********************************************************************************
Define Part
********************************************************************************
*/
/*
********************************************************************************
Local Variable Declaration Section
********************************************************************************
*/
extern u8 MAC[6];
extern CONFIG_MSG Config_Msg;
u8 DHCP_SIP[4];
u8 DHCP_SHA[6];
u8 OLD_SIP[4];
char dhcp_state;
char retry_count;
un_l2cval lease_time;
u32 my_time, next_time;
u8 DHCP_timeout;
u32 DHCP_XID;
//RIP_MSG * MSG;
RIP_MSG MSG;
u8 HOST_NAME[] = "WIZNET";
u8 Cip[4] = {0,0,0,0};
extern void (*jump_function)(void);
/*
********************************************************************************
Function Implementation Part
********************************************************************************
*/
/*
*********************************************************************************************************
* SEND DHCP DISCOVER
*
* Description: This function sends DHCP DISCOVER message to DHCP server.
* Arguments : s - is a socket number.
* Returns : None.
* Note :
*********************************************************************************************************
*/
void send_DHCP_DISCOVER(u8 s)
{
u16 i;
u8 ip[4];
u16 k = 0;
MSG.op = DHCP_BOOTREQUEST;
MSG.htype = DHCP_HTYPE10MB;
MSG.hlen = DHCP_HLENETHERNET;
MSG.hops = DHCP_HOPS;
MSG.xid = DHCP_XID;
MSG.secs = DHCP_SECS;
MSG.flags = DHCP_FLAGSBROADCAST;
MSG.ciaddr[0] = 0;
MSG.ciaddr[1] = 0;
MSG.ciaddr[2] = 0;
MSG.ciaddr[3] = 0;
MSG.yiaddr[0] = 0;
MSG.yiaddr[1] = 0;
MSG.yiaddr[2] = 0;
MSG.yiaddr[3] = 0;
MSG.siaddr[0] = 0;
MSG.siaddr[1] = 0;
MSG.siaddr[2] = 0;
MSG.siaddr[3] = 0;
MSG.giaddr[0] = 0;
MSG.giaddr[1] = 0;
MSG.giaddr[2] = 0;
MSG.giaddr[3] = 0;
MSG.chaddr[0] = MAC[0];
MSG.chaddr[1] = MAC[1];
MSG.chaddr[2] = MAC[2];
MSG.chaddr[3] = MAC[3];
MSG.chaddr[4] = MAC[4];
MSG.chaddr[5] = MAC[5];
for (i = 6; i < 16; i++) MSG.chaddr[i] = 0;
for (i = 0; i < 64; i++) MSG.sname[i] = 0;
for (i = 0; i < 128; i++) MSG.file[i] = 0;
// MAGIC_COOKIE
MSG.OPT[k++] = 0x63;
MSG.OPT[k++] = 0x82;
MSG.OPT[k++] = 0x53;
MSG.OPT[k++] = 0x63;
// Option Request Param
MSG.OPT[k++] = dhcpMessageType;
MSG.OPT[k++] = 0x01;
MSG.OPT[k++] = DHCP_DISCOVER;
// Client identifier
MSG.OPT[k++] = dhcpClientIdentifier;
MSG.OPT[k++] = 0x07;
MSG.OPT[k++] = 0x01;
MSG.OPT[k++] = MAC[0];
MSG.OPT[k++] = MAC[1];
MSG.OPT[k++] = MAC[2];
MSG.OPT[k++] = MAC[3];
MSG.OPT[k++] = MAC[4];
MSG.OPT[k++] = MAC[5];
// host name
MSG.OPT[k++] = hostName;
MSG.OPT[k++] = 9; // length of hostname
MSG.OPT[k++] = HOST_NAME[0];
MSG.OPT[k++] = HOST_NAME[1];
MSG.OPT[k++] = HOST_NAME[2];
MSG.OPT[k++] = HOST_NAME[3];
MSG.OPT[k++] = HOST_NAME[4];
MSG.OPT[k++] = HOST_NAME[5];
MSG.OPT[k++] = MAC[3];
MSG.OPT[k++] = MAC[4];
MSG.OPT[k++] = MAC[5];
MSG.OPT[k++] = dhcpParamRequest;
MSG.OPT[k++] = 0x06; // length of request
MSG.OPT[k++] = subnetMask;
MSG.OPT[k++] = routersOnSubnet;
MSG.OPT[k++] = dns;
MSG.OPT[k++] = domainName;
MSG.OPT[k++] = dhcpT1value;
MSG.OPT[k++] = dhcpT2value;
MSG.OPT[k++] = endOption;
for (i = k; i < OPT_SIZE; i++) MSG.OPT[i] = 0;
// send broadcasting packet
for (i = 0; i < 4; i++) ip[i] = 255;
MyPrintf("> send DHCP_DISCOVER\r\n");
sendto(s, (u8 *)(&MSG.op), RIP_MSG_SIZE, ip, DHCP_SERVER_PORT);
}
/*
*********************************************************************************************************
* SEND DHCP REQUEST
*
* Description: This function sends DHCP REQUEST message to DHCP server.
* Arguments : s - is a socket number.
* Returns : None.
* Note :
*********************************************************************************************************
*/
void send_DHCP_REQUEST(u8 s, u8 *Cip, u8 *d_addr)
{
int i;
u8 ip[10];
u16 k = 0;
MSG.op = DHCP_BOOTREQUEST;
MSG.htype = DHCP_HTYPE10MB;
MSG.hlen = DHCP_HLENETHERNET;
MSG.hops = DHCP_HOPS;
MSG.xid = DHCP_XID;
MSG.secs = DHCP_SECS;
//MSG.flags = DHCP_FLAGSBROADCAST;
if (d_addr[0] == 0xff) MSG.flags = DHCP_FLAGSBROADCAST;
else MSG.flags = 0;
MSG.ciaddr[0] = Cip[0];
MSG.ciaddr[1] = Cip[1];
MSG.ciaddr[2] = Cip[2];
MSG.ciaddr[3] = Cip[3];
MSG.yiaddr[0] = 0;
MSG.yiaddr[1] = 0;
MSG.yiaddr[2] = 0;
MSG.yiaddr[3] = 0;
MSG.siaddr[0] = 0;
MSG.siaddr[1] = 0;
MSG.siaddr[2] = 0;
MSG.siaddr[3] = 0;
MSG.giaddr[0] = 0;
MSG.giaddr[1] = 0;
MSG.giaddr[2] = 0;
MSG.giaddr[3] = 0;
MSG.chaddr[0] = MAC[0];
MSG.chaddr[1] = MAC[1];
MSG.chaddr[2] = MAC[2];
MSG.chaddr[3] = MAC[3];
MSG.chaddr[4] = MAC[4];
MSG.chaddr[5] = MAC[5];
for (i = 6; i < 16; i++) MSG.chaddr[i] = 0;
for (i = 0; i < 64; i++) MSG.sname[i] = 0;
for (i = 0; i < 128; i++) MSG.file[i] = 0;
// MAGIC_COOKIE
MSG.OPT[k++] = 0x63;
MSG.OPT[k++] = 0x82;
MSG.OPT[k++] = 0x53;
MSG.OPT[k++] = 0x63;
// Option Request Param.
MSG.OPT[k++] = dhcpMessageType;
MSG.OPT[k++] = 0x01;
MSG.OPT[k++] = DHCP_REQUEST;
MSG.OPT[k++] = dhcpClientIdentifier;
MSG.OPT[k++] = 0x07;
MSG.OPT[k++] = 0x01;
MSG.OPT[k++] = MAC[0];
MSG.OPT[k++] = MAC[1];
MSG.OPT[k++] = MAC[2];
MSG.OPT[k++] = MAC[3];
MSG.OPT[k++] = MAC[4];
MSG.OPT[k++] = MAC[5];
if (d_addr[0] == 0xff) {
MSG.OPT[k++] = dhcpRequestedIPaddr;
MSG.OPT[k++] = 0x04;
MSG.OPT[k++] = Config_Msg.Lip[0];
MSG.OPT[k++] = Config_Msg.Lip[1];
MSG.OPT[k++] = Config_Msg.Lip[2];
MSG.OPT[k++] = Config_Msg.Lip[3];
MSG.OPT[k++] = dhcpServerIdentifier;
MSG.OPT[k++] = 0x04;
MSG.OPT[k++] = DHCP_SIP[0];
MSG.OPT[k++] = DHCP_SIP[1];
MSG.OPT[k++] = DHCP_SIP[2];
MSG.OPT[k++] = DHCP_SIP[3];
}
// host name
MSG.OPT[k++] = hostName;
MSG.OPT[k++] = 9; // length of hostname
MSG.OPT[k++] = HOST_NAME[0];
MSG.OPT[k++] = HOST_NAME[1];
MSG.OPT[k++] = HOST_NAME[2];
MSG.OPT[k++] = HOST_NAME[3];
MSG.OPT[k++] = HOST_NAME[4];
MSG.OPT[k++] = HOST_NAME[5];
MSG.OPT[k++] = MAC[3];
MSG.OPT[k++] = MAC[4];
MSG.OPT[k++] = MAC[5];
MSG.OPT[k++] = dhcpParamRequest;
MSG.OPT[k++] = 0x08;
MSG.OPT[k++] = subnetMask;
MSG.OPT[k++] = routersOnSubnet;
MSG.OPT[k++] = dns;
MSG.OPT[k++] = domainName;
MSG.OPT[k++] = dhcpT1value;
MSG.OPT[k++] = dhcpT2value;
MSG.OPT[k++] = performRouterDiscovery;
MSG.OPT[k++] = staticRoute;
MSG.OPT[k++] = endOption;
for (i = k; i < OPT_SIZE; i++) MSG.OPT[i] = 0;
// send broadcasting packet
for (i = 0; i < 4; i++) ip[i] = d_addr[i];
MyPrintf("> send DHCP_Request\r\n");
sendto(s, (u8 *)(&MSG.op), RIP_MSG_SIZE, ip, DHCP_SERVER_PORT);
}
/*
*********************************************************************************************************
* SEND DHCP DHCPDECLINE
*
* Description: This function sends DHCP RELEASE message to DHCP server.
* Arguments : s - is a socket number.
* Returns : None.
* Note :
*********************************************************************************************************
*/
void send_DHCP_DECLINE(u8 s)
{
int i;
u8 ip[10];
u16 k = 0;
MSG.op = DHCP_BOOTREQUEST;
MSG.htype = DHCP_HTYPE10MB;
MSG.hlen = DHCP_HLENETHERNET;
MSG.hops = DHCP_HOPS;
MSG.xid = DHCP_XID;
MSG.secs = DHCP_SECS;
MSG.flags = 0;
MSG.ciaddr[0] = 0;
MSG.ciaddr[1] = 0;
MSG.ciaddr[2] = 0;
MSG.ciaddr[3] = 0;
MSG.yiaddr[0] = 0;
MSG.yiaddr[1] = 0;
MSG.yiaddr[2] = 0;
MSG.yiaddr[3] = 0;
MSG.siaddr[0] = 0;
MSG.siaddr[1] = 0;
MSG.siaddr[2] = 0;
MSG.siaddr[3] = 0;
MSG.giaddr[0] = 0;
MSG.giaddr[1] = 0;
MSG.giaddr[2] = 0;
MSG.giaddr[3] = 0;
MSG.chaddr[0] = MAC[0];
MSG.chaddr[1] = MAC[1];
MSG.chaddr[2] = MAC[2];
MSG.chaddr[3] = MAC[3];
MSG.chaddr[4] = MAC[4];
MSG.chaddr[5] = MAC[5];
for (i = 6; i < 16; i++) MSG.chaddr[i] = 0;
for (i = 0; i < 64; i++) MSG.sname[i] = 0;
for (i = 0; i < 128; i++) MSG.file[i] = 0;
// MAGIC_COOKIE
MSG.OPT[k++] = 0x63;
MSG.OPT[k++] = 0x82;
MSG.OPT[k++] = 0x53;
MSG.OPT[k++] = 0x63;
// Option Request Param.
MSG.OPT[k++] = dhcpMessageType;
MSG.OPT[k++] = 0x01;
MSG.OPT[k++] = DHCP_DECLINE;
MSG.OPT[k++] = dhcpClientIdentifier;
MSG.OPT[k++] = 0x07;
MSG.OPT[k++] = 0x01;
MSG.OPT[k++] = MAC[0];
MSG.OPT[k++] = MAC[1];
MSG.OPT[k++] = MAC[2];
MSG.OPT[k++] = MAC[3];
MSG.OPT[k++] = MAC[4];
MSG.OPT[k++] = MAC[5];
MSG.OPT[k++] = dhcpRequestedIPaddr;
MSG.OPT[k++] = 0x04;
MSG.OPT[k++] = Config_Msg.Lip[0];
MSG.OPT[k++] = Config_Msg.Lip[1];
MSG.OPT[k++] = Config_Msg.Lip[2];
MSG.OPT[k++] = Config_Msg.Lip[3];
MSG.OPT[k++] = dhcpServerIdentifier;
MSG.OPT[k++] = 0x04;
MSG.OPT[k++] = DHCP_SIP[0];
MSG.OPT[k++] = DHCP_SIP[1];
MSG.OPT[k++] = DHCP_SIP[2];
MSG.OPT[k++] = DHCP_SIP[3];
MSG.OPT[k++] = endOption;
for (i = k; i < OPT_SIZE; i++) MSG.OPT[i] = 0;
//send broadcasting packet
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -