- simplified DHCP
-added UdpAppend() git-svn-id: http://moon:8086/svn/mips@219 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
+76
-116
@@ -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);
|
||||
}
|
||||
@@ -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,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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user