- initial import
git-svn-id: http://moon:8086/svn/mips@1 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
+155
@@ -0,0 +1,155 @@
|
||||
// -------------------------------------------------------------------------
|
||||
// ethernet.c
|
||||
//
|
||||
// 21.12.2003, J. Ahrensfeld
|
||||
//
|
||||
// -------------------------------------------------------------------------
|
||||
#include "libsys.h"
|
||||
#include "ethernet.h"
|
||||
#include "ipv4.h"
|
||||
#include "udp.h"
|
||||
#include "dhcp.h"
|
||||
#include "string.h"
|
||||
|
||||
const char hostname[] = "ML-402";
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// 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)
|
||||
{
|
||||
uint16_t sum;
|
||||
DHCP *pDHCP;
|
||||
uint8_t *pData;
|
||||
dhcp_opt_hdr_t *pOpt_hdr;
|
||||
uint32_t size, pos, magic = 0x63825363;
|
||||
|
||||
|
||||
pDHCP = (DHCP*)UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, NULL, sizeof(DHCP));
|
||||
|
||||
memset(pDHCP, 0, sizeof(DHCP));
|
||||
|
||||
pDHCP->op = DHCP_BOOTREQUEST;
|
||||
pDHCP->htype = TYPE_HW_ETH10;
|
||||
pDHCP->hlen = 6;
|
||||
pDHCP->hops = 0;
|
||||
pDHCP->secs = 0;
|
||||
pDHCP->flags = 0;
|
||||
memcpy(pDHCP->chaddr, mac_addr_src, pDHCP->hlen);
|
||||
|
||||
switch(dhcp_msg_type)
|
||||
{
|
||||
case DHCP_MSG_DHCPDISCOVER:
|
||||
|
||||
pDHCP->xid = (uint32_t)rand();
|
||||
|
||||
// Options
|
||||
pos = 0;
|
||||
|
||||
size = sizeof(magic);
|
||||
memcpy(&pDHCP->options[pos], &magic, size);
|
||||
pos += size;
|
||||
|
||||
// Set msg type
|
||||
size = sizeof(dhcp_opt_hdr_t);
|
||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
||||
pOpt_hdr->code = DHCP_OPT_MSGTYPE;
|
||||
pOpt_hdr->len = 1;
|
||||
pos += size;
|
||||
|
||||
size = pOpt_hdr->len;
|
||||
pDHCP->options[pos] = dhcp_msg_type;
|
||||
pos += size;
|
||||
|
||||
// Set client ID
|
||||
size = sizeof(dhcp_opt_hdr_t);
|
||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
||||
pOpt_hdr->code = DHCP_OPT_CLIENTID;
|
||||
pOpt_hdr->len = 6;
|
||||
pos += size;
|
||||
|
||||
size = pOpt_hdr->len;
|
||||
memcpy(&pDHCP->options[pos], mac_addr_src, size);
|
||||
pos += size;
|
||||
|
||||
// Set client name
|
||||
size = sizeof(dhcp_opt_hdr_t);
|
||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
||||
pOpt_hdr->code = DHCP_OPT_HOSTNAME;
|
||||
pOpt_hdr->len = strlen(hostname);
|
||||
pos += size;
|
||||
|
||||
size = pOpt_hdr->len;
|
||||
memcpy(&pDHCP->options[pos], hostname, size);
|
||||
pos += size;
|
||||
|
||||
pDHCP->options[pos] = DHCP_OPT_END;
|
||||
break;
|
||||
|
||||
case DHCP_MSG_DHCPREQUEST:
|
||||
|
||||
pDHCP->xid = pLast->xid;
|
||||
|
||||
// Options
|
||||
pos = 0;
|
||||
|
||||
size = sizeof(magic);
|
||||
memcpy(&pDHCP->options[pos], &magic, size);
|
||||
pos += size;
|
||||
|
||||
// Set msg type
|
||||
size = sizeof(dhcp_opt_hdr_t);
|
||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
||||
pOpt_hdr->code = DHCP_OPT_MSGTYPE;
|
||||
pOpt_hdr->len = 1;
|
||||
pos += size;
|
||||
|
||||
size = pOpt_hdr->len;
|
||||
pDHCP->options[pos] = dhcp_msg_type;
|
||||
pos += size;
|
||||
|
||||
// Set client ID
|
||||
size = sizeof(dhcp_opt_hdr_t);
|
||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
||||
pOpt_hdr->code = DHCP_OPT_CLIENTID;
|
||||
pOpt_hdr->len = 6;
|
||||
pos += size;
|
||||
|
||||
size = pOpt_hdr->len;
|
||||
memcpy(&pDHCP->options[pos], mac_addr_src, size);
|
||||
pos += size;
|
||||
|
||||
// Set client name
|
||||
size = sizeof(dhcp_opt_hdr_t);
|
||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
||||
pOpt_hdr->code = DHCP_OPT_HOSTNAME;
|
||||
pOpt_hdr->len = strlen(hostname);
|
||||
pos += size;
|
||||
|
||||
size = pOpt_hdr->len;
|
||||
memcpy(&pDHCP->options[pos], hostname, size);
|
||||
pos += size;
|
||||
|
||||
// Set requested IP address
|
||||
size = sizeof(dhcp_opt_hdr_t);
|
||||
pOpt_hdr = (dhcp_opt_hdr_t*)&pDHCP->options[pos];
|
||||
pOpt_hdr->code = DHCP_OPT_REQIP;
|
||||
pOpt_hdr->len = 4;
|
||||
pos += size;
|
||||
|
||||
size = pOpt_hdr->len;
|
||||
memcpy(&pDHCP->options[pos], pLast->yiaddr, size);
|
||||
pos += size;
|
||||
|
||||
pDHCP->options[pos] = DHCP_OPT_END;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
pData = (uint8_t*)Eth_pkt_append(pPacket, sizeof(DHCP));
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user