// ------------------------------------------------------------------------- // ethernet.c // // 21.12.2003, J. Ahrensfeld // // ------------------------------------------------------------------------- #include #include #include #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)); }