From 5fe751ef97a0c99ae51f03114fe7c2fb218faa3c Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Thu, 25 Nov 2021 07:06:41 +0000 Subject: [PATCH] - simplified DHCP -added UdpAppend() git-svn-id: http://moon:8086/svn/mips@219 a8ebac50-d88d-4704-bea3-6648445a41b3 --- src/common/network/dhcp.c | 192 +++++++++++++++----------------------- src/common/network/dhcp.h | 14 ++- src/common/network/udp.c | 12 ++- src/common/network/udp.h | 3 +- 4 files changed, 102 insertions(+), 119 deletions(-) diff --git a/src/common/network/dhcp.c b/src/common/network/dhcp.c index b58107c..10fc56e 100644 --- a/src/common/network/dhcp.c +++ b/src/common/network/dhcp.c @@ -6,6 +6,7 @@ // ------------------------------------------------------------------------- #include #include +#include #include #include "ethernet.h" #include "ipv4.h" @@ -20,10 +21,7 @@ const char hostname[] = "ml402"; 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) { DHCP dhcp; - dhcp_opt_hdr_t *pOpt_hdr; uint32_t size; - uint32_t magic = DHCP_MAGIC_COOKIE; - uint32_t option_size; DHCP *pDHCP = &dhcp; @@ -37,130 +35,92 @@ void DHCP_request_send(packet_t *pPacket, uint32_t dhcp_msg_type, uint8_t *mac_a pDHCP->flags = DHCP_FLAGS_BROADCAST; memcpy(pDHCP->chaddr, mac_addr_src, pDHCP->hlen); + // Options + uint8_t buffer[7]; + option_list_t options; + option_list_init(&options, pDHCP->options, sizeof(dhcp_option_t)); + + // Set msg type + size = data_entry_create(buffer, TYPE_HW_ETH10, &dhcp_msg_type, 1); + option_list_append(&options, DHCP_OPT_MSGTYPE, buffer, size); + +#ifdef WITH_CLIENT_ID + // Set client ID + size = data_entry_create(buffer, TYPE_HW_ETH10, mac_addr_src, 6); + option_list_append(&options, DHCP_OPT_CLIENTID, buffer, size); +#endif + + // Set client name + option_list_append(&options, DHCP_OPT_HOSTNAME, hostname, strlen(hostname)); + switch(dhcp_msg_type) { case DHCP_MSG_DHCPDISCOVER: - - pDHCP->xid = (uint32_t)rand(); - - // Options - option_size = 0; - - size = sizeof(magic); - 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[option_size]; - pOpt_hdr->code = DHCP_OPT_MSGTYPE; - pOpt_hdr->len = 1; - option_size += size; - - size = pOpt_hdr->len; - 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[option_size]; - pOpt_hdr->code = DHCP_OPT_CLIENTID; - pOpt_hdr->len = 7; - option_size += size; - - size = 1; - pDHCP->options[option_size] = TYPE_HW_ETH10; - option_size += size; - - size = 6; - 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[option_size]; - pOpt_hdr->code = DHCP_OPT_HOSTNAME; - pOpt_hdr->len = strlen(hostname); - option_size += size; - - size = pOpt_hdr->len; - memcpy(&pDHCP->options[option_size], hostname, size); - option_size += size; - - pDHCP->options[option_size] = DHCP_OPT_END; - option_size++; - + { + pDHCP->xid = (uint32_t)rand(); + } break; case DHCP_MSG_DHCPREQUEST: + { + pDHCP->xid = pLast->xid; - pDHCP->xid = pLast->xid; - - // Options - option_size = 0; - - size = sizeof(magic); - 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[option_size]; - pOpt_hdr->code = DHCP_OPT_MSGTYPE; - pOpt_hdr->len = 1; - option_size += size; - - size = pOpt_hdr->len; - 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[option_size]; - pOpt_hdr->code = DHCP_OPT_CLIENTID; - pOpt_hdr->len = 7; - option_size += size; - - size = 1; - pDHCP->options[option_size] = TYPE_HW_ETH10; - option_size += size; - - size = 6; - 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[option_size]; - pOpt_hdr->code = DHCP_OPT_HOSTNAME; - pOpt_hdr->len = strlen(hostname); - option_size += size; - - size = pOpt_hdr->len; - 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[option_size]; - pOpt_hdr->code = DHCP_OPT_REQIP; - pOpt_hdr->len = 4; - option_size += size; - - size = pOpt_hdr->len; - memcpy(&pDHCP->options[option_size], pLast->yiaddr, size); - option_size += size; - - pDHCP->options[option_size] = DHCP_OPT_END; - option_size++; + // Set requested IP address + option_list_append(&options, DHCP_OPT_REQIP, pLast->yiaddr, size); + } break; default: break; } - UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, (uint8_t*)&dhcp, sizeof(DHCP)); + // End + option_list_append(&options, DHCP_OPT_END, NULL, 0); + + // Create packet + UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, &dhcp, sizeof(DHCP)); } +void option_list_init(option_list_t *pObj, void *pBuffer, size_t size) +{ + pObj->capacity = size; + pObj->buffer = pBuffer; + pObj->pData = pObj->buffer; + pObj->size = 0; + + uint32_t magic = DHCP_MAGIC_COOKIE; + memcpy(pObj->pData, &magic, sizeof(uint32_t)); + pObj->size += sizeof(uint32_t); + pObj->pData += sizeof(uint32_t); + +} +void option_list_append(option_list_t *pObj, uint8_t option_type, void const *pData, size_t size) +{ + assert(size < 256); + assert(pObj->size + sizeof(dhcp_opt_hdr_t) + size < pObj->capacity); + assert(!(pData != NULL ^ size != 0)); + + dhcp_opt_hdr_t *pHdr = (dhcp_opt_hdr_t*)pObj->pData; + pHdr->code = option_type; + pHdr->size = size; + + pObj->pData += sizeof(dhcp_opt_hdr_t); + pObj->size += sizeof(dhcp_opt_hdr_t); + + if (size) + { + memcpy(pObj->pData, pData, size); + } + pObj->pData += size; + pObj->size += size; + +} + +size_t data_entry_create(void *pDst, uint8_t type, void const *pData, size_t size) +{ + uint8_t *pDst8 = (uint8_t*)pDst; + *(pDst8++) = type; + memcpy(pDst8, pData, size); + pDst8 += size; + + return (size_t)(pDst8 - (uint8_t*)pDst); +} \ No newline at end of file diff --git a/src/common/network/dhcp.h b/src/common/network/dhcp.h index b4f7f4d..a4652bc 100644 --- a/src/common/network/dhcp.h +++ b/src/common/network/dhcp.h @@ -38,10 +38,19 @@ typedef struct _sDHCP typedef struct _sdhcp_opt_hdr_t { - uint8_t code, len; + uint8_t code; + uint8_t size; } __attribute__ ((__packed__)) dhcp_opt_hdr_t; +typedef struct _soption_list_t +{ + size_t capacity; + size_t size; + uint8_t *buffer; + uint8_t *pData; +} option_list_t; + #define DHCP_FLAGS_BROADCAST 0x8000 #define DHCP_OPT_HOSTNAME 12 @@ -61,6 +70,9 @@ typedef struct _sdhcp_opt_hdr_t // ------------------------------------------------------------------------- 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 option_list_init(option_list_t *pObj, void *pBuffer, size_t size); +void option_list_append(option_list_t *pObj, uint8_t option_type, void const *pData, size_t size); +size_t data_entry_create(void *pDst, uint8_t type, void const *pData, size_t size); // ------------------------------------------------------------------------- #endif // DHCP_H diff --git a/src/common/network/udp.c b/src/common/network/udp.c index 7603369..c0f6df3 100644 --- a/src/common/network/udp.c +++ b/src/common/network/udp.c @@ -11,7 +11,7 @@ // ------------------------------------------------------------------------- // Testing -uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src, uint8_t *inet_addr_dst, uint16_t port_dst, uint8_t *pUDP_payload, uint16_t len) +uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src, uint8_t *inet_addr_dst, uint16_t port_dst, void const *pUDP_payload, uint16_t len) { uint16_t sum; UDP *pUDP; @@ -48,3 +48,13 @@ uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src return pData; } + +void UDP_append(packet_t *pPacket, void const *pData, uint16_t len) +{ + // Commit data + if (pData) + { + memcpy(pPacket->pData, pData, len); + Eth_pkt_append(pPacket, len); + } +} \ No newline at end of file diff --git a/src/common/network/udp.h b/src/common/network/udp.h index 53c3cc4..d5cd924 100644 --- a/src/common/network/udp.h +++ b/src/common/network/udp.h @@ -30,7 +30,8 @@ typedef struct _sUDPPP } __attribute__ ((__packed__)) UDPPP; // ------------------------------------------------------------------------- -uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src, uint8_t *inet_addr_dst, uint16_t port_dst, uint8_t *pUDP_payload, uint16_t len); +uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src, uint8_t *inet_addr_dst, uint16_t port_dst, void const *pUDP_payload, uint16_t len); +void UDP_append(packet_t *pPacket, void const *pData, uint16_t len); // ------------------------------------------------------------------------- #endif // UDP_H