71 |
|
|
72 |
/* |
/* |
73 |
* Parse a DHCP response packet |
* Parse a DHCP response packet |
74 |
|
* Returns: |
75 |
|
* 0 = Not handled |
76 |
|
* 2 = DHCPOFFER (from dhcp_proto.h) |
77 |
|
* 5 = DHCPACK |
78 |
|
* 6 = DHCPNACK |
79 |
*/ |
*/ |
80 |
static int |
static int dhcp_parse(struct netdev *dev, struct bootp_hdr *hdr, |
81 |
dhcp_parse(struct netdev *dev, struct bootp_hdr *hdr, uint8_t * exts, int extlen) |
uint8_t * exts, int extlen) |
82 |
{ |
{ |
83 |
uint8_t type = 0; |
uint8_t type = 0; |
84 |
uint32_t serverid = INADDR_NONE; |
uint32_t serverid = INADDR_NONE; |
106 |
|
|
107 |
switch (type) { |
switch (type) { |
108 |
case DHCPOFFER: |
case DHCPOFFER: |
109 |
ret = bootp_parse(dev, hdr, exts, extlen); |
ret = bootp_parse(dev, hdr, exts, extlen) ? DHCPOFFER : 0; |
110 |
if (ret == 1 && serverid != INADDR_NONE) |
if (ret == DHCPOFFER && serverid != INADDR_NONE) |
111 |
dev->serverid = serverid; |
dev->serverid = serverid; |
112 |
DEBUG(("\n dhcp offer\n")); |
DEBUG(("\n dhcp offer\n")); |
113 |
break; |
break; |
114 |
|
|
115 |
case DHCPACK: |
case DHCPACK: |
116 |
ret = bootp_parse(dev, hdr, exts, extlen); |
ret = bootp_parse(dev, hdr, exts, extlen) ? DHCPACK : 0; |
117 |
DEBUG(("\n dhcp ack\n")); |
DEBUG(("\n dhcp ack\n")); |
118 |
break; |
break; |
119 |
|
|
120 |
case DHCPNAK: |
case DHCPNAK: |
121 |
ret = 2; |
ret = DHCPNAK; |
122 |
DEBUG(("\n dhcp nak\n")); |
DEBUG(("\n dhcp nak\n")); |
123 |
break; |
break; |
124 |
} |
} |
127 |
|
|
128 |
/* |
/* |
129 |
* Receive and parse a DHCP packet |
* Receive and parse a DHCP packet |
130 |
|
* Returns: |
131 |
|
*-1 = Error in packet_recv |
132 |
|
* 0 = Not handled |
133 |
|
* 2 = DHCPOFFER (from dhcp_proto.h) |
134 |
|
* 5 = DHCPACK |
135 |
|
* 6 = DHCPNACK |
136 |
*/ |
*/ |
137 |
static int dhcp_recv(struct netdev *dev) |
static int dhcp_recv(struct netdev *dev) |
138 |
{ |
{ |
151 |
|
|
152 |
DEBUG(("\n dhcp xid %08x ", dev->bootp.xid)); |
DEBUG(("\n dhcp xid %08x ", dev->bootp.xid)); |
153 |
|
|
154 |
if (ret < sizeof(struct bootp_hdr) || bootp.op != BOOTP_REPLY || /* RFC951 7.5 */ |
if (ret < sizeof(struct bootp_hdr) || bootp.op != BOOTP_REPLY || |
155 |
bootp.xid != dev->bootp.xid || |
/* RFC951 7.5 */ bootp.xid != dev->bootp.xid || |
156 |
memcmp(bootp.chaddr, dev->hwaddr, 16)) |
memcmp(bootp.chaddr, dev->hwaddr, 16)) |
157 |
return 0; |
return 0; |
158 |
|
|
172 |
bootp.hlen = dev->hwlen; |
bootp.hlen = dev->hwlen; |
173 |
bootp.xid = dev->bootp.xid; |
bootp.xid = dev->bootp.xid; |
174 |
bootp.ciaddr = dev->ip_addr; |
bootp.ciaddr = dev->ip_addr; |
175 |
bootp.giaddr = dev->bootp.gateway; |
bootp.giaddr = INADDR_ANY; |
176 |
bootp.secs = htons(time(NULL) - dev->open_time); |
bootp.secs = htons(time(NULL) - dev->open_time); |
177 |
memcpy(bootp.chaddr, dev->hwaddr, 16); |
memcpy(bootp.chaddr, dev->hwaddr, 16); |
178 |
|
|