- 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 <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <libsys/libsys.h>
|
#include <libsys/libsys.h>
|
||||||
#include "ethernet.h"
|
#include "ethernet.h"
|
||||||
#include "ipv4.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)
|
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 dhcp;
|
||||||
dhcp_opt_hdr_t *pOpt_hdr;
|
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint32_t magic = DHCP_MAGIC_COOKIE;
|
|
||||||
uint32_t option_size;
|
|
||||||
|
|
||||||
DHCP *pDHCP = &dhcp;
|
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;
|
pDHCP->flags = DHCP_FLAGS_BROADCAST;
|
||||||
memcpy(pDHCP->chaddr, mac_addr_src, pDHCP->hlen);
|
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)
|
switch(dhcp_msg_type)
|
||||||
{
|
{
|
||||||
case DHCP_MSG_DHCPDISCOVER:
|
case DHCP_MSG_DHCPDISCOVER:
|
||||||
|
{
|
||||||
pDHCP->xid = (uint32_t)rand();
|
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++;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCP_MSG_DHCPREQUEST:
|
case DHCP_MSG_DHCPREQUEST:
|
||||||
|
{
|
||||||
|
pDHCP->xid = pLast->xid;
|
||||||
|
|
||||||
pDHCP->xid = pLast->xid;
|
// Set requested IP address
|
||||||
|
option_list_append(&options, DHCP_OPT_REQIP, pLast->yiaddr, size);
|
||||||
// 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++;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
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
|
typedef struct _sdhcp_opt_hdr_t
|
||||||
{
|
{
|
||||||
uint8_t code, len;
|
uint8_t code;
|
||||||
|
uint8_t size;
|
||||||
|
|
||||||
} __attribute__ ((__packed__)) dhcp_opt_hdr_t;
|
} __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_FLAGS_BROADCAST 0x8000
|
||||||
|
|
||||||
#define DHCP_OPT_HOSTNAME 12
|
#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 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
|
#endif // DHCP_H
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// Testing
|
// 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;
|
uint16_t sum;
|
||||||
UDP *pUDP;
|
UDP *pUDP;
|
||||||
@@ -48,3 +48,13 @@ uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src
|
|||||||
return pData;
|
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;
|
} __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
|
#endif // UDP_H
|
||||||
|
|||||||
Reference in New Issue
Block a user