xref: /kvmtool/net/uip/dhcp.c (revision bdcc9e40df201b98ba1b2e2fac1ecd8cc13ac9cc)
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