167 lines
4.1 KiB
C
167 lines
4.1 KiB
C
// -------------------------------------------------------------------------
|
|
// ethernet.c
|
|
//
|
|
// 21.12.2003, J. Ahrensfeld
|
|
//
|
|
// -------------------------------------------------------------------------
|
|
#include <string.h>
|
|
#include <time.h>
|
|
#include <libsys/libsys.h>
|
|
#include "ethernet.h"
|
|
#include "ipv4.h"
|
|
#include "udp.h"
|
|
#include "dhcp.h"
|
|
|
|
#define WITH_CLIENT_ID 1
|
|
const char hostname[] = "ml402";
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 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)
|
|
{
|
|
DHCP dhcp;
|
|
dhcp_opt_hdr_t *pOpt_hdr;
|
|
uint32_t size;
|
|
uint32_t magic = DHCP_MAGIC_COOKIE;
|
|
uint32_t option_size;
|
|
|
|
DHCP *pDHCP = &dhcp;
|
|
|
|
memset(pDHCP, 0, sizeof(DHCP));
|
|
|
|
pDHCP->op = DHCP_BOOTREQUEST;
|
|
pDHCP->htype = TYPE_HW_ETH10;
|
|
pDHCP->hlen = 6;
|
|
pDHCP->hops = 0;
|
|
pDHCP->secs = clock()/CLOCKS_PER_SEC;
|
|
pDHCP->flags = DHCP_FLAGS_BROADCAST;
|
|
memcpy(pDHCP->chaddr, mac_addr_src, pDHCP->hlen);
|
|
|
|
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++;
|
|
|
|
break;
|
|
|
|
case DHCP_MSG_DHCPREQUEST:
|
|
|
|
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++;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, (uint8_t*)&dhcp, sizeof(DHCP));
|
|
}
|
|
|