- 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:
2021-11-24 11:18:53 +00:00
parent 888c71bf72
commit 9c248bd884
3 changed files with 64 additions and 63 deletions
+47 -49
View File
@@ -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));
} }
+7 -3
View File
@@ -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;
+10 -11
View File
@@ -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();