// ------------------------------------------------------------------------- // 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)); }