10c4bfcacSAsias He #include "kvm/uip.h" 20c4bfcacSAsias He 3*bdcc9e40SAsias He #include <arpa/inet.h> 4*bdcc9e40SAsias He 58f5f2f95SAsias He static inline bool uip_dhcp_is_discovery(struct uip_dhcp *dhcp) 68f5f2f95SAsias He { 78f5f2f95SAsias He return (dhcp->option[2] == UIP_DHCP_DISCOVER && 88f5f2f95SAsias He dhcp->option[1] == UIP_DHCP_TAG_MSG_TYPE_LEN && 98f5f2f95SAsias He dhcp->option[0] == UIP_DHCP_TAG_MSG_TYPE); 108f5f2f95SAsias He } 118f5f2f95SAsias He 128f5f2f95SAsias He static inline bool uip_dhcp_is_request(struct uip_dhcp *dhcp) 138f5f2f95SAsias He { 148f5f2f95SAsias He return (dhcp->option[2] == UIP_DHCP_REQUEST && 158f5f2f95SAsias He dhcp->option[1] == UIP_DHCP_TAG_MSG_TYPE_LEN && 168f5f2f95SAsias He dhcp->option[0] == UIP_DHCP_TAG_MSG_TYPE); 178f5f2f95SAsias He } 188f5f2f95SAsias He 190c4bfcacSAsias He bool uip_udp_is_dhcp(struct uip_udp *udp) 200c4bfcacSAsias He { 210c4bfcacSAsias He struct uip_dhcp *dhcp; 220c4bfcacSAsias He 230c4bfcacSAsias He if (ntohs(udp->sport) != UIP_DHCP_PORT_CLIENT || 240c4bfcacSAsias He ntohs(udp->dport) != UIP_DHCP_PORT_SERVER) 250c4bfcacSAsias He return false; 260c4bfcacSAsias He 270c4bfcacSAsias He dhcp = (struct uip_dhcp *)udp; 280c4bfcacSAsias He 290c4bfcacSAsias He if (ntohl(dhcp->magic_cookie) != UIP_DHCP_MAGIC_COOKIE) 300c4bfcacSAsias He return false; 310c4bfcacSAsias He 320c4bfcacSAsias He return true; 330c4bfcacSAsias He } 34*bdcc9e40SAsias He 35*bdcc9e40SAsias He int uip_dhcp_get_dns(struct uip_info *info) 36*bdcc9e40SAsias He { 37*bdcc9e40SAsias He char key[256], val[256]; 38*bdcc9e40SAsias He struct in_addr addr; 39*bdcc9e40SAsias He int ret = -1; 40*bdcc9e40SAsias He int n = 0; 41*bdcc9e40SAsias He FILE *fp; 42*bdcc9e40SAsias He u32 ip; 43*bdcc9e40SAsias He 44*bdcc9e40SAsias He fp = fopen("/etc/resolv.conf", "r"); 45*bdcc9e40SAsias He if (!fp) 46*bdcc9e40SAsias He goto out; 47*bdcc9e40SAsias He 48*bdcc9e40SAsias He while (!feof(fp)) { 49*bdcc9e40SAsias He if (fscanf(fp, "%s %s\n", key, val) != 2) 50*bdcc9e40SAsias He continue; 51*bdcc9e40SAsias He if (strncmp("domain", key, 6) == 0) 52*bdcc9e40SAsias He info->domain_name = strndup(val, UIP_DHCP_MAX_DOMAIN_NAME_LEN); 53*bdcc9e40SAsias He else if (strncmp("nameserver", key, 10) == 0) { 54*bdcc9e40SAsias He if (!inet_aton(val, &addr)) 55*bdcc9e40SAsias He continue; 56*bdcc9e40SAsias He ip = ntohl(addr.s_addr); 57*bdcc9e40SAsias He if (n < UIP_DHCP_MAX_DNS_SERVER_NR) 58*bdcc9e40SAsias He info->dns_ip[n++] = ip; 59*bdcc9e40SAsias He ret = 0; 60*bdcc9e40SAsias He } 61*bdcc9e40SAsias He } 62*bdcc9e40SAsias He 63*bdcc9e40SAsias He out: 64*bdcc9e40SAsias He fclose(fp); 65*bdcc9e40SAsias He return ret; 66*bdcc9e40SAsias He } 67