- fixed Eth_pkt_send()
- dhcp: don't send padding bytes for whole options git-svn-id: http://moon:8086/svn/mips@211 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
+47
-49
@@ -11,20 +11,20 @@
|
|||||||
#include "udp.h"
|
#include "udp.h"
|
||||||
#include "dhcp.h"
|
#include "dhcp.h"
|
||||||
|
|
||||||
|
#define WITH_CLIENT_ID 1
|
||||||
const char hostname[] = "ML-402";
|
const char hostname[] = "ML-402";
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// Testing
|
// Testing
|
||||||
void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_addr_src, uint8_t *inet_addr_src, uint8_t *inet_addr_dst, DHCP *pLast)
|
void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_addr_src, uint8_t *inet_addr_src, uint8_t *inet_addr_dst, DHCP *pLast)
|
||||||
{
|
{
|
||||||
uint16_t sum;
|
DHCP dhcp;
|
||||||
DHCP *pDHCP;
|
|
||||||
uint8_t *pData;
|
|
||||||
dhcp_opt_hdr_t *pOpt_hdr;
|
dhcp_opt_hdr_t *pOpt_hdr;
|
||||||
uint32_t size, pos, magic = 0x63825363;
|
uint32_t size;
|
||||||
|
uint32_t magic = 0x63825363;
|
||||||
|
uint32_t option_size;
|
||||||
pDHCP = (DHCP*)UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, NULL, sizeof(DHCP));
|
|
||||||
|
DHCP *pDHCP = &dhcp;
|
||||||
|
|
||||||
memset(pDHCP, 0, sizeof(DHCP));
|
memset(pDHCP, 0, sizeof(DHCP));
|
||||||
|
|
||||||
@@ -43,49 +43,50 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a
|
|||||||
pDHCP->xid = (uint32_t)rand();
|
pDHCP->xid = (uint32_t)rand();
|
||||||
|
|
||||||
// Options
|
// Options
|
||||||
pos = 0;
|
option_size = 0;
|
||||||
|
|
||||||
size = sizeof(magic);
|
size = sizeof(magic);
|
||||||
memset(&pDHCP->options[pos], 0xAA, sizeof(pDHCP->options));
|
memcpy(&pDHCP->options[option_size], &magic, size);
|
||||||
memcpy(&pDHCP->options[pos], &magic, size);
|
option_size += size;
|
||||||
pos += size;
|
|
||||||
|
|
||||||
// Set msg type
|
// Set msg type
|
||||||
size = sizeof(dhcp_opt_hdr_t);
|
size = sizeof(dhcp_opt_hdr_t);
|
||||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[option_size];
|
||||||
pOpt_hdr->code = DHCP_OPT_MSGTYPE;
|
pOpt_hdr->code = DHCP_OPT_MSGTYPE;
|
||||||
pOpt_hdr->len = 1;
|
pOpt_hdr->len = 1;
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
size = pOpt_hdr->len;
|
size = pOpt_hdr->len;
|
||||||
pDHCP->options[pos] = dhcp_msg_type;
|
pDHCP->options[option_size] = dhcp_msg_type;
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
#ifdef WITH_CLIENT_ID
|
#ifdef WITH_CLIENT_ID
|
||||||
// Set client ID
|
// Set client ID
|
||||||
size = sizeof(dhcp_opt_hdr_t);
|
size = sizeof(dhcp_opt_hdr_t);
|
||||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[option_size];
|
||||||
pOpt_hdr->code = DHCP_OPT_CLIENTID;
|
pOpt_hdr->code = DHCP_OPT_CLIENTID;
|
||||||
pOpt_hdr->len = 6;
|
pOpt_hdr->len = 6;
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
size = pOpt_hdr->len;
|
size = pOpt_hdr->len;
|
||||||
memcpy(&pDHCP->options[pos], mac_addr_src, size);
|
memcpy(&pDHCP->options[option_size], mac_addr_src, size);
|
||||||
pos += size;
|
option_size += size;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Set client name
|
// Set client name
|
||||||
size = sizeof(dhcp_opt_hdr_t);
|
size = sizeof(dhcp_opt_hdr_t);
|
||||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[option_size];
|
||||||
pOpt_hdr->code = DHCP_OPT_HOSTNAME;
|
pOpt_hdr->code = DHCP_OPT_HOSTNAME;
|
||||||
pOpt_hdr->len = strlen(hostname);
|
pOpt_hdr->len = strlen(hostname);
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
size = pOpt_hdr->len;
|
size = pOpt_hdr->len;
|
||||||
memcpy(&pDHCP->options[pos], hostname, size);
|
memcpy(&pDHCP->options[option_size], hostname, size);
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
pDHCP->options[pos] = DHCP_OPT_END;
|
pDHCP->options[option_size] = DHCP_OPT_END;
|
||||||
|
option_size++;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCP_MSG_DHCPREQUEST:
|
case DHCP_MSG_DHCPREQUEST:
|
||||||
@@ -93,67 +94,64 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a
|
|||||||
pDHCP->xid = pLast->xid;
|
pDHCP->xid = pLast->xid;
|
||||||
|
|
||||||
// Options
|
// Options
|
||||||
pos = 0;
|
option_size = 0;
|
||||||
|
|
||||||
size = sizeof(magic);
|
size = sizeof(magic);
|
||||||
memcpy(&pDHCP->options[pos], &magic, size);
|
memcpy(&pDHCP->options[option_size], &magic, size);
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
// Set msg type
|
// Set msg type
|
||||||
size = sizeof(dhcp_opt_hdr_t);
|
size = sizeof(dhcp_opt_hdr_t);
|
||||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[option_size];
|
||||||
pOpt_hdr->code = DHCP_OPT_MSGTYPE;
|
pOpt_hdr->code = DHCP_OPT_MSGTYPE;
|
||||||
pOpt_hdr->len = 1;
|
pOpt_hdr->len = 1;
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
size = pOpt_hdr->len;
|
size = pOpt_hdr->len;
|
||||||
pDHCP->options[pos] = dhcp_msg_type;
|
pDHCP->options[option_size] = dhcp_msg_type;
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
#ifdef WITH_CLIENT_ID
|
#ifdef WITH_CLIENT_ID
|
||||||
// Set client ID
|
// Set client ID
|
||||||
size = sizeof(dhcp_opt_hdr_t);
|
size = sizeof(dhcp_opt_hdr_t);
|
||||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[option_size];
|
||||||
pOpt_hdr->code = DHCP_OPT_CLIENTID;
|
pOpt_hdr->code = DHCP_OPT_CLIENTID;
|
||||||
pOpt_hdr->len = 6;
|
pOpt_hdr->len = 6;
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
size = pOpt_hdr->len;
|
size = pOpt_hdr->len;
|
||||||
memcpy(&pDHCP->options[pos], mac_addr_src, size);
|
memcpy(&pDHCP->options[option_size], mac_addr_src, size);
|
||||||
pos += size;
|
option_size += size;
|
||||||
#endif
|
#endif
|
||||||
// Set client name
|
// Set client name
|
||||||
size = sizeof(dhcp_opt_hdr_t);
|
size = sizeof(dhcp_opt_hdr_t);
|
||||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[option_size];
|
||||||
pOpt_hdr->code = DHCP_OPT_HOSTNAME;
|
pOpt_hdr->code = DHCP_OPT_HOSTNAME;
|
||||||
pOpt_hdr->len = strlen(hostname);
|
pOpt_hdr->len = strlen(hostname);
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
size = pOpt_hdr->len;
|
size = pOpt_hdr->len;
|
||||||
memcpy(&pDHCP->options[pos], hostname, size);
|
memcpy(&pDHCP->options[option_size], hostname, size);
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
// Set requested IP address
|
// Set requested IP address
|
||||||
size = sizeof(dhcp_opt_hdr_t);
|
size = sizeof(dhcp_opt_hdr_t);
|
||||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[option_size];
|
||||||
pOpt_hdr->code = DHCP_OPT_REQIP;
|
pOpt_hdr->code = DHCP_OPT_REQIP;
|
||||||
pOpt_hdr->len = 4;
|
pOpt_hdr->len = 4;
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
size = pOpt_hdr->len;
|
size = pOpt_hdr->len;
|
||||||
memcpy(&pDHCP->options[pos], pLast->yiaddr, size);
|
memcpy(&pDHCP->options[option_size], pLast->yiaddr, size);
|
||||||
pos += size;
|
option_size += size;
|
||||||
|
|
||||||
pDHCP->options[pos] = DHCP_OPT_END;
|
pDHCP->options[option_size] = DHCP_OPT_END;
|
||||||
|
option_size++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, (uint8_t*)&dhcp, sizeof(DHCP) - sizeof(dhcp_option_t) + option_size);
|
||||||
|
|
||||||
|
|
||||||
pData = (uint8_t*)Eth_pkt_append(pPacket, sizeof(DHCP));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
#include "ethernet.h"
|
#include "ethernet.h"
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
typedef uint8_t dhcp_sname_t[64];
|
||||||
|
typedef uint8_t dhcp_file_t[128];
|
||||||
|
typedef uint8_t dhcp_option_t[312];
|
||||||
|
|
||||||
typedef struct _sDHCP
|
typedef struct _sDHCP
|
||||||
{
|
{
|
||||||
uint8_t op, htype, hlen, hops;
|
uint8_t op, htype, hlen, hops;
|
||||||
@@ -21,9 +25,9 @@ typedef struct _sDHCP
|
|||||||
uint8_t siaddr[4];
|
uint8_t siaddr[4];
|
||||||
uint8_t giaddr[4];
|
uint8_t giaddr[4];
|
||||||
uint8_t chaddr[16];
|
uint8_t chaddr[16];
|
||||||
uint8_t sname[64];
|
dhcp_sname_t sname;
|
||||||
uint8_t file[128];
|
dhcp_file_t file;
|
||||||
uint8_t options[312];
|
dhcp_option_t options;
|
||||||
|
|
||||||
} __attribute__ ((__packed__)) DHCP;
|
} __attribute__ ((__packed__)) DHCP;
|
||||||
|
|
||||||
|
|||||||
@@ -95,20 +95,19 @@ uint32_t Eth_pkt_send(packet_t *pPacket)
|
|||||||
|
|
||||||
while(num_words >= 8)
|
while(num_words >= 8)
|
||||||
{
|
{
|
||||||
*pEmac_data = pData[i+0];
|
*pEmac_data = *(pData++);
|
||||||
*pEmac_data = pData[i+1];
|
*pEmac_data = *(pData++);
|
||||||
*pEmac_data = pData[i+2];
|
*pEmac_data = *(pData++);
|
||||||
*pEmac_data = pData[i+3];
|
*pEmac_data = *(pData++);
|
||||||
*pEmac_data = pData[i+4];
|
*pEmac_data = *(pData++);
|
||||||
*pEmac_data = pData[i+5];
|
*pEmac_data = *(pData++);
|
||||||
*pEmac_data = pData[i+6];
|
*pEmac_data = *(pData++);
|
||||||
*pEmac_data = pData[i+7];
|
*pEmac_data = *(pData++);
|
||||||
i += 8;
|
|
||||||
num_words -= 8;
|
num_words -= 8;
|
||||||
}
|
}
|
||||||
for (i=0; i < num_words; i++)
|
while(num_words--)
|
||||||
{
|
{
|
||||||
*pEmac_data = pData[i];
|
*pEmac_data = *(pData++);
|
||||||
}
|
}
|
||||||
|
|
||||||
EMAC_TX_commit();
|
EMAC_TX_commit();
|
||||||
|
|||||||
Reference in New Issue
Block a user