- simplified DHCP

-added UdpAppend()


git-svn-id: http://moon:8086/svn/mips@219 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
2021-11-25 07:06:41 +00:00
parent 08e4680fdf
commit 5fe751ef97
4 changed files with 102 additions and 119 deletions
+76 -116
View File
@@ -6,6 +6,7 @@
// -------------------------------------------------------------------------
#include <string.h>
#include <time.h>
#include <assert.h>
#include <libsys/libsys.h>
#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);
}
+13 -1
View File
@@ -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
+11 -1
View File
@@ -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);
}
}
+2 -1
View File
@@ -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