/***************************************************
**
**
***************************************************/
#include "../Header/includes.h"
#include "W5100.h"
#define HOST_NAME "WIZnet" /**< Host Name */
unsigned char SRC_MAC_ADDR[6]={0x00,0x08,0xDC,0x01,0x02,0x15}; //SRC_MAC_ADD 板子MAC地址,必须保证每块板子唯一;
//该地址可将最后一个字节每次加1,确保DHCP获取的IP地址不同
unsigned char GET_SN_MASK[4]; /**< Subnet mask received from the DHCP server */
unsigned char GET_GW_IP[4]; /**< Gateway ip address received from the DHCP server */
unsigned char GET_DNS_IP[4]; /**< DNS server ip address received from the DHCP server */
unsigned char GET_SIP[4]; /**< Local ip address received from the DHCP server */
unsigned char DHCP_SIP[4] = {0,}; /**< DNS server ip address is discovered */
//static unsigned char DHCP_REAL_SIP[4] = {0,}; /**< For extract my DHCP server in a few DHCP servers */
//static unsigned char OLD_SIP[4]; /**< Previous local ip address received from DHCP server */
//static char dhcp_state; /**< DHCP client status */
//static RIP_MSG* DHCP_MSG; /**< Pointer for the DHCP message */
char dhcp_state;
RIP_MSG* DHCP_MSG;
unsigned char DHCP_buffer[1460];
/**************************************************
**
**************************************************/
void send_DHCP_DISCOVER(SOCKET s)
{
unsigned int i=0;
DHCP_MSG = (RIP_MSG*)DHCP_buffer;
memset((void*)DHCP_MSG,0,sizeof(RIP_MSG));
/* create DHCP message */
DHCP_MSG->op = DHCP_BOOTREQUEST;
DHCP_MSG->htype = DHCP_HTYPE10MB; /* htype=ethernet */
DHCP_MSG->hlen = DHCP_HLENETHERNET; /* hlen=6 for ethernet */
DHCP_MSG->hops = DHCP_HOPS; /* hops=0 by clients */
/* xid, use constant value for all requests (allowed by RFC) */
DHCP_MSG->xid[0] = 0xdd;
DHCP_MSG->xid[1] = 0xBB;
DHCP_MSG->xid[2] = 0xCC;
DHCP_MSG->xid[3] = 0xDD;
/* seconds from boot. Fixed for now */
DHCP_MSG->secs[0] = 0x00;
DHCP_MSG->secs[1] = 0x00;
/* flags, use broadcast */
DHCP_MSG->flags[0] = 0x80;
DHCP_MSG->flags[1] = 0x00;
/* chaddr */
DHCP_MSG->chaddr[0] = SRC_MAC_ADDR[0];
DHCP_MSG->chaddr[1] = SRC_MAC_ADDR[1];
DHCP_MSG->chaddr[2] = SRC_MAC_ADDR[2];
DHCP_MSG->chaddr[3] = SRC_MAC_ADDR[3];
DHCP_MSG->chaddr[4] = SRC_MAC_ADDR[4];
DHCP_MSG->chaddr[5] = SRC_MAC_ADDR[5];
/* MAGIC_COOKIE */
DHCP_MSG->OPT[i++] = (char)((MAGIC_COOKIE >> 24)& 0xFF);
DHCP_MSG->OPT[i++] = (char)((MAGIC_COOKIE >> 16)& 0xFF);
DHCP_MSG->OPT[i++] = (char)((MAGIC_COOKIE >> 8)& 0xFF);
DHCP_MSG->OPT[i++] = (char)(MAGIC_COOKIE& 0xFF);
/* message type */
DHCP_MSG->OPT[i++]=dhcpMessageType;
DHCP_MSG->OPT[i++]=0x01;
DHCP_MSG->OPT[i++]=DHCP_DISCOVER;
/* Client identifier*/
DHCP_MSG->OPT[i++] = dhcpClientIdentifier;
DHCP_MSG->OPT[i++] = 0x07;
DHCP_MSG->OPT[i++] = 0x01;
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[0];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[1];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[2];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[3];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[4];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[5];
DHCP_MSG->OPT[i++]=hostName;
DHCP_MSG->OPT[i++]=strlen(HOST_NAME)+3;
memcpy(DHCP_MSG->OPT+i,HOST_NAME,strlen(HOST_NAME));
i+=strlen(HOST_NAME);
/**/
DHCP_MSG->OPT[i++]=SRC_MAC_ADDR[3];
DHCP_MSG->OPT[i++]=SRC_MAC_ADDR[4];
DHCP_MSG->OPT[i++]=SRC_MAC_ADDR[5];
/* parameter request list. These also MUST be transmitted
* with DHCP REQUEST message */
DHCP_MSG->OPT[i++] = dhcpParamRequest;
DHCP_MSG->OPT[i++] = 0x06;
DHCP_MSG->OPT[i++] = subnetMask;
DHCP_MSG->OPT[i++] = routersOnSubnet;
DHCP_MSG->OPT[i++] = dns;
DHCP_MSG->OPT[i++] = domainName;
DHCP_MSG->OPT[i++] = dhcpT1value;
DHCP_MSG->OPT[i++] = dhcpT2value;
DHCP_MSG->OPT[i++] = endOption;
DHCP_send((unsigned char *)DHCP_MSG,DHCP_DISCOVER,0);
}
/**************************************************
**
**************************************************/
void send_DHCP_REQUEST(SOCKET s)
{
unsigned int i=0;
memcpy(GET_SIP,DHCP_MSG->yiaddr,4);
DHCP_MSG = (RIP_MSG*)DHCP_buffer;
memset((void*)DHCP_MSG,0,sizeof(RIP_MSG));
DHCP_MSG->op = DHCP_BOOTREQUEST;
DHCP_MSG->htype = DHCP_HTYPE10MB;
DHCP_MSG->hlen = DHCP_HLENETHERNET;
DHCP_MSG->hops = DHCP_HOPS;
/* xid, use constant value for all requests (allowed by RFC) */
DHCP_MSG->xid[0] = 0xAA;
DHCP_MSG->xid[1] = 0xBB;
DHCP_MSG->xid[2] = 0xCC;
DHCP_MSG->xid[3] = 0xFF;
/* seconds from boot. Fixed for now */
DHCP_MSG->secs[0] = 0x00;
DHCP_MSG->secs[1] = 0x00;
if(dhcp_state < STATE_DHCP_LEASED)
{
/* flags, use broadcast */
DHCP_MSG->flags[0] = 0x80;
DHCP_MSG->flags[1] = 0x00;
}
else
{
DHCP_MSG->flags[0] = 0X00; // For Unicast
DHCP_MSG->flags[1] = 0x00;
DHCP_MSG->ciaddr[0] = GET_SIP[0];
DHCP_MSG->ciaddr[1] = GET_SIP[1];
DHCP_MSG->ciaddr[2] = GET_SIP[2];
DHCP_MSG->ciaddr[3] = GET_SIP[3];
}
/* chaddr */
DHCP_MSG->chaddr[0] = SRC_MAC_ADDR[0];
DHCP_MSG->chaddr[1] = SRC_MAC_ADDR[1];
DHCP_MSG->chaddr[2] = SRC_MAC_ADDR[2];
DHCP_MSG->chaddr[3] = SRC_MAC_ADDR[3];
DHCP_MSG->chaddr[4] = SRC_MAC_ADDR[4];
DHCP_MSG->chaddr[5] = SRC_MAC_ADDR[5];
/* MAGIC_COOKIE */
DHCP_MSG->OPT[i++] = (char)((MAGIC_COOKIE >> 24)& 0xFF);
DHCP_MSG->OPT[i++] = (char)((MAGIC_COOKIE >> 16)& 0xFF);
DHCP_MSG->OPT[i++] = (char)((MAGIC_COOKIE >> 8)& 0xFF);
DHCP_MSG->OPT[i++] = (char)(MAGIC_COOKIE& 0xFF);
/* message type */
DHCP_MSG->OPT[i++]=dhcpMessageType;
DHCP_MSG->OPT[i++]=0x01;
DHCP_MSG->OPT[i++]=DHCP_REQUEST;
/* Client identifier*/
DHCP_MSG->OPT[i++] = dhcpClientIdentifier;
DHCP_MSG->OPT[i++] = 0x07;
DHCP_MSG->OPT[i++] = 0x01;
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[0];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[1];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[2];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[3];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[4];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[5];
if(dhcp_state < STATE_DHCP_LEASED)
{
DHCP_MSG->OPT[i++] = dhcpRequestedIPaddr;
DHCP_MSG->OPT[i++] = 0x04;
DHCP_MSG->OPT[i++] = GET_SIP[0];
DHCP_MSG->OPT[i++] = GET_SIP[1];
DHCP_MSG->OPT[i++] = GET_SIP[2];
DHCP_MSG->OPT[i++] = GET_SIP[3];
DHCP_MSG->OPT[i++] = dhcpServerIdentifier;
DHCP_MSG->OPT[i++] = 0x04;
DHCP_MSG->OPT[i++] = DHCP_SIP[0];
DHCP_MSG->OPT[i++] = DHCP_SIP[1];
DHCP_MSG->OPT[i++] = DHCP_SIP[2];
DHCP_MSG->OPT[i++] = DHCP_SIP[3];
}
// host name
DHCP_MSG->OPT[i++]=hostName;
DHCP_MSG->OPT[i++]=strlen(HOST_NAME)+3;
memcpy(DHCP_MSG->OPT+i,HOST_NAME,strlen(HOST_NAME));
i+=strlen(HOST_NAME);
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[3];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[4];
DHCP_MSG->OPT[i++] = SRC_MAC_ADDR[5];
DHCP_MSG->OPT[i++] = dhcpParamRequest;
DHCP_MSG->OPT[i++] = 0x08;
DHCP_MSG->OPT[i++] = subnetMask;
DHCP_MSG->OPT[i++] = routersOnSubnet;
DHCP_MSG->OPT[i++] = dns;
DHCP_MSG->OPT[i++] = domainName;
DHCP_MSG->OPT[i++] = dhcpT1value;
DHCP_MSG->OPT[i++] = dhcpT2value;
DHCP_MSG->OPT[i++] = performRouterDiscovery;
DHCP_MSG->OPT[i++] = staticRoute;
DHCP_MSG->OPT[i++] = endOption;
DHCP_send((unsigned char *)DHCP_MSG,DHCP_REQUEST,0);
}
/**************************************************
**
**************************************************/
void DHCP_RUN(SOCKET s)
{
send_DHCP_DISCOVER(0);
dhcp_state = STATE_DHCP_DISCOVER;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
STM32F10x_DHCP.zip (2个子文件)
dhcp.c 7KB
dhcp.h 4KB
共 2 条
- 1
资源评论
gxut2687585
- 粉丝: 0
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功