-
Notifications
You must be signed in to change notification settings - Fork 6
/
dhcp.c
99 lines (83 loc) · 2.26 KB
/
dhcp.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include "dhcp.h"
#include "common.h"
/*
* TODO 这里没有实现dhcp协议,只是把接口留在这里了。
* 使用了一种替代方案来使程序工作
*/
/* TODO 暂时为我们学校固定 */
#define DHCP_SERVER "10.255.0.195"
/**
* 为s设置接口名字
* 使用s进行dhcp获取ip时,**必须**先指明接口
* @return: 0: 成功
* -1: 失败
*/
int dhcp_setif(dhcp_t *s, char const *ifname)
{
strncpy(s->ifname, ifname, IF_NAMESIZE);
_D("ifname: %s\n", s->ifname);
return 0;
}
/**
* 从s里获取dhcp服务器ip信息
* s: dhcp_t结构体
* type: AF_INET: ipv4; AF_INET6: ipv6
* serip: 如果是AF_INET,这是一个struct in_addr指针
* 如果是AF_INET6, 这是一个struct in6_addr指针
* @return: 0: 成功
* -1: s没有需要获取的信息
*/
int dhcp_getsip(dhcp_t *s, int type, void *serip)
{
(void)type;
memcpy(serip, &s->_data._v4._serip, sizeof(struct in_addr));
return 0;
}
/* 获取到的ip, 和上述类似 */
int dhcp_getcip(dhcp_t *s, int type, void *clip)
{
(void)type;
memcpy(clip, &s->_data._v4._clip, sizeof(struct in_addr));
return 0;
}
/* 获取获取到ip的subnet mask, 和上述类似 */
int dhcp_getmask(dhcp_t *s, int type, void *mask)
{
(void)type;
memcpy(mask, &s->_data._v4._mask, sizeof(struct in_addr));
return 0;
}
/**
* 执行dhcp协议获取可用ip和mask信息
* tip需要给出接口信息
* 结果存储在tip里
* @return: 0: 成功
* 1: 没有这个接口
* 2: 网络并不通,没有服务器响应
* -1: 超时
*/
int dhcp_run(dhcp_t *tip)
{
struct in_addr ip;
inet_pton(AF_INET, DHCP_SERVER, &ip);
memcpy(&tip->_data._v4._serip, &ip, sizeof(ip));
struct timespec stime, etime;
/*
* 每3秒检测网络是否通
* 直到一个超过DHCP_TIMEOUT时间
*/
clock_gettime(CLOCK_MONOTONIC, &stime);
clock_gettime(CLOCK_MONOTONIC, &etime);
while (!isnetok(tip->ifname) && difftimespec(etime, stime) <= 1000*DHCP_TIMEOUT) {
sleep(3);
clock_gettime(CLOCK_MONOTONIC, &etime);
}
if (difftimespec(etime, stime) > 1000*DHCP_TIMEOUT) {
return -1;
}
return 0;
}