/** * DHCP: Sends DHCP-Release message. Releases occupied IP. */ void dhcp_send_release(void) { uint32_t packetsize = sizeof(struct iphdr) + sizeof(struct udphdr) + sizeof(struct btphdr); struct btphdr *btph; dhcp_options_t opt; btph = (struct btphdr *) (ðer_packet[ sizeof(struct iphdr) + sizeof(struct udphdr)]); memset(ether_packet, 0, packetsize); btph -> op = 1; btph -> htype = 1; btph -> hlen = 6; strcpy((char *) btph -> file, ""); memcpy(btph -> chaddr, get_mac_address(), 6); btph -> ciaddr = htonl(dhcp_own_ip); memset(&opt, 0, sizeof(dhcp_options_t)); opt.msg_type = DHCPRELEASE; opt.server_ID = dhcp_server_ip; opt.flag[DHCP_SERVER_ID] = 1; dhcp_encode_options(btph -> vend, &opt); fill_udphdr(ðer_packet[sizeof(struct iphdr)], sizeof(struct btphdr) + sizeof(struct udphdr), UDPPORT_BOOTPC, UDPPORT_BOOTPS); fill_iphdr(ether_packet, sizeof(struct btphdr) + sizeof(struct udphdr) + sizeof(struct iphdr), IPTYPE_UDP, dhcp_own_ip, dhcp_server_ip); send_ipv4(ether_packet, packetsize); }
/** * DNS: Sends a standard DNS-query (read request package) to a DNS-server. * DNS-server respones with host IP or signals some error condition. * Responses from the server are handled by handle_dns function. * * @param fd socket descriptor * @param domain_name the domain name given as series of labels preceded * with length(label) and terminated with 0 * <br>(e.g. "\3,w,w,w,\4,h,o,s,t,\3,o,r,g,\0") * @see handle_dns */ static void dns_send_query(int fd, int8_t * domain_name, uint8_t ip_version) { int qry_len = strlen((char *) domain_name) + 5; int iphdr_len = (ip_version == 4) ? sizeof(struct iphdr) : sizeof(struct ip6hdr); ip6_addr_t server_ipv6; uint32_t packetsize = iphdr_len + sizeof(struct udphdr) + sizeof(struct dnshdr) + qry_len; memset(ether_packet, 0, packetsize); fill_dnshdr(ðer_packet[ iphdr_len + sizeof(struct udphdr)], domain_name, ip_version); fill_udphdr(ðer_packet[iphdr_len], sizeof(struct dnshdr) + sizeof(struct udphdr) + qry_len, UDPPORT_DNSC, UDPPORT_DNSS); if (ip_version == 4) { fill_iphdr(ether_packet, sizeof(struct dnshdr) + sizeof(struct udphdr) + iphdr_len + qry_len, IPTYPE_UDP, 0, dns_server_ip); } else { memcpy(server_ipv6.addr, dns_server_ipv6, 16); fill_ip6hdr(ether_packet, sizeof(struct dnshdr) + sizeof(struct udphdr) + qry_len, IPTYPE_UDP, get_ipv6_address(), &server_ipv6); } send_ip(fd, ether_packet, packetsize); }
char *fill_ppk_udpbigport(const struct probing_info *pi, int *size) { char *packet = new_packet(IPPROTO_UDP, pi->option, size); fill_iphdr((struct iphdr *) packet, *size, *size, _pID, pi->ttl, IPPROTO_UDP, pi->src, pi->dst); fill_udphdr((struct udphdr *) (packet + sizeof(struct iphdr)), *size - sizeof(struct iphdr), _SEQ, pi->dport, *size - sizeof(struct iphdr), pi->src, pi->dst); return packet; }
/** * DHCP: Sends DHCP-Request message. Asks for acknowledgment to occupy IP. */ static void dhcp_send_request(void) { uint32_t packetsize = sizeof(struct iphdr) + sizeof(struct udphdr) + sizeof(struct btphdr); struct btphdr *btph; dhcp_options_t opt; memset(ether_packet, 0, packetsize); btph = (struct btphdr *) (ðer_packet[ sizeof(struct iphdr) + sizeof(struct udphdr)]); btph -> op = 1; btph -> htype = 1; btph -> hlen = 6; memcpy(btph -> chaddr, get_mac_address(), 6); memset(&opt, 0, sizeof(dhcp_options_t)); opt.msg_type = DHCPREQUEST; memcpy(&(opt.requested_IP), &dhcp_own_ip, 4); opt.flag[DHCP_REQUESTED_IP] = 1; memcpy(&(opt.server_ID), &dhcp_server_ip, 4); opt.flag[DHCP_SERVER_ID] = 1; opt.request_list[DHCP_MASK] = 1; opt.request_list[DHCP_DNS] = 1; opt.request_list[DHCP_ROUTER] = 1; opt.request_list[DHCP_TFTP_SERVER] = 1; opt.request_list[DHCP_BOOTFILE] = 1; dhcp_encode_options(btph -> vend, &opt); fill_udphdr(ðer_packet[sizeof(struct iphdr)], sizeof(struct btphdr) + sizeof(struct udphdr), UDPPORT_BOOTPC, UDPPORT_BOOTPS); fill_iphdr(ether_packet, sizeof(struct btphdr) + sizeof(struct udphdr) + sizeof(struct iphdr), IPTYPE_UDP, 0, 0xFFFFFFFF); send_ipv4(ether_packet, packetsize); }