From 9c248bd88451f68563bd8f74f643c8e5a5aedc8f Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Wed, 24 Nov 2021 11:18:53 +0000 Subject: [PATCH] - 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 --- src/common/network/dhcp.c | 96 +++++++++++++++++------------------ src/common/network/dhcp.h | 10 ++-- src/common/network/ethernet.c | 21 ++++---- 3 files changed, 64 insertions(+), 63 deletions(-) diff --git a/src/common/network/dhcp.c b/src/common/network/dhcp.c index 73834da..addfda1 100644 --- a/src/common/network/dhcp.c +++ b/src/common/network/dhcp.c @@ -11,20 +11,20 @@ #include "udp.h" #include "dhcp.h" +#define WITH_CLIENT_ID 1 const char hostname[] = "ML-402"; // ------------------------------------------------------------------------- // 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) { - uint16_t sum; - DHCP *pDHCP; - uint8_t *pData; + DHCP dhcp; dhcp_opt_hdr_t *pOpt_hdr; - uint32_t size, pos, magic = 0x63825363; - - - pDHCP = (DHCP*)UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, NULL, sizeof(DHCP)); + uint32_t size; + uint32_t magic = 0x63825363; + uint32_t option_size; + + DHCP *pDHCP = &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(); // Options - pos = 0; + option_size = 0; size = sizeof(magic); - memset(&pDHCP->options[pos], 0xAA, sizeof(pDHCP->options)); - memcpy(&pDHCP->options[pos], &magic, size); - pos += size; + memcpy(&pDHCP->options[option_size], &magic, size); + option_size += size; // Set msg type 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->len = 1; - pos += size; + option_size += size; size = pOpt_hdr->len; - pDHCP->options[pos] = dhcp_msg_type; - pos += size; + pDHCP->options[option_size] = dhcp_msg_type; + option_size += size; #ifdef WITH_CLIENT_ID // Set client ID 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->len = 6; - pos += size; + option_size += size; size = pOpt_hdr->len; - memcpy(&pDHCP->options[pos], mac_addr_src, size); - pos += size; + memcpy(&pDHCP->options[option_size], mac_addr_src, size); + option_size += size; #endif // Set client name 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->len = strlen(hostname); - pos += size; + option_size += size; size = pOpt_hdr->len; - memcpy(&pDHCP->options[pos], hostname, size); - pos += size; + memcpy(&pDHCP->options[option_size], hostname, size); + option_size += size; - pDHCP->options[pos] = DHCP_OPT_END; + pDHCP->options[option_size] = DHCP_OPT_END; + option_size++; + break; 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; // Options - pos = 0; + option_size = 0; size = sizeof(magic); - memcpy(&pDHCP->options[pos], &magic, size); - pos += size; + memcpy(&pDHCP->options[option_size], &magic, size); + option_size += size; // Set msg type 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->len = 1; - pos += size; + option_size += size; size = pOpt_hdr->len; - pDHCP->options[pos] = dhcp_msg_type; - pos += size; + pDHCP->options[option_size] = dhcp_msg_type; + option_size += size; #ifdef WITH_CLIENT_ID // Set client ID 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->len = 6; - pos += size; + option_size += size; size = pOpt_hdr->len; - memcpy(&pDHCP->options[pos], mac_addr_src, size); - pos += size; + memcpy(&pDHCP->options[option_size], mac_addr_src, size); + option_size += size; #endif // Set client name 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->len = strlen(hostname); - pos += size; + option_size += size; size = pOpt_hdr->len; - memcpy(&pDHCP->options[pos], hostname, size); - pos += size; + memcpy(&pDHCP->options[option_size], hostname, size); + option_size += size; // Set requested IP address 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->len = 4; - pos += size; + option_size += size; size = pOpt_hdr->len; - memcpy(&pDHCP->options[pos], pLast->yiaddr, size); - pos += size; + memcpy(&pDHCP->options[option_size], pLast->yiaddr, size); + option_size += size; - pDHCP->options[pos] = DHCP_OPT_END; + pDHCP->options[option_size] = DHCP_OPT_END; + option_size++; break; default: break; } - - - - pData = (uint8_t*)Eth_pkt_append(pPacket, sizeof(DHCP)); - + UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, (uint8_t*)&dhcp, sizeof(DHCP) - sizeof(dhcp_option_t) + option_size); } diff --git a/src/common/network/dhcp.h b/src/common/network/dhcp.h index fe01d93..105c827 100644 --- a/src/common/network/dhcp.h +++ b/src/common/network/dhcp.h @@ -11,6 +11,10 @@ #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 { uint8_t op, htype, hlen, hops; @@ -21,9 +25,9 @@ typedef struct _sDHCP uint8_t siaddr[4]; uint8_t giaddr[4]; uint8_t chaddr[16]; - uint8_t sname[64]; - uint8_t file[128]; - uint8_t options[312]; + dhcp_sname_t sname; + dhcp_file_t file; + dhcp_option_t options; } __attribute__ ((__packed__)) DHCP; diff --git a/src/common/network/ethernet.c b/src/common/network/ethernet.c index fde6441..1226315 100644 --- a/src/common/network/ethernet.c +++ b/src/common/network/ethernet.c @@ -95,20 +95,19 @@ uint32_t Eth_pkt_send(packet_t *pPacket) while(num_words >= 8) { - *pEmac_data = pData[i+0]; - *pEmac_data = pData[i+1]; - *pEmac_data = pData[i+2]; - *pEmac_data = pData[i+3]; - *pEmac_data = pData[i+4]; - *pEmac_data = pData[i+5]; - *pEmac_data = pData[i+6]; - *pEmac_data = pData[i+7]; - i += 8; + *pEmac_data = *(pData++); + *pEmac_data = *(pData++); + *pEmac_data = *(pData++); + *pEmac_data = *(pData++); + *pEmac_data = *(pData++); + *pEmac_data = *(pData++); + *pEmac_data = *(pData++); + *pEmac_data = *(pData++); num_words -= 8; } - for (i=0; i < num_words; i++) + while(num_words--) { - *pEmac_data = pData[i]; + *pEmac_data = *(pData++); } EMAC_TX_commit();