1*10465441SEvalZero #include "test_dhcp.h"
2*10465441SEvalZero
3*10465441SEvalZero #include "lwip/netif.h"
4*10465441SEvalZero #include "lwip/dhcp.h"
5*10465441SEvalZero #include "lwip/prot/dhcp.h"
6*10465441SEvalZero #include "lwip/etharp.h"
7*10465441SEvalZero #include "netif/ethernet.h"
8*10465441SEvalZero
9*10465441SEvalZero struct netif net_test;
10*10465441SEvalZero
11*10465441SEvalZero static const u8_t broadcast[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
12*10465441SEvalZero
13*10465441SEvalZero static const u8_t magic_cookie[] = { 0x63, 0x82, 0x53, 0x63 };
14*10465441SEvalZero
15*10465441SEvalZero static u8_t dhcp_offer[] = {
16*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, /* To unit */
17*10465441SEvalZero 0x00, 0x0F, 0xEE, 0x30, 0xAB, 0x22, /* From Remote host */
18*10465441SEvalZero 0x08, 0x00, /* Protocol: IP */
19*10465441SEvalZero 0x45, 0x10, 0x01, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x36, 0xcc, 0xc3, 0xaa, 0xbd, 0xab, 0xc3, 0xaa, 0xbd, 0xc8, /* IP header */
20*10465441SEvalZero 0x00, 0x43, 0x00, 0x44, 0x01, 0x34, 0x00, 0x00, /* UDP header */
21*10465441SEvalZero
22*10465441SEvalZero 0x02, /* Type == Boot reply */
23*10465441SEvalZero 0x01, 0x06, /* Hw Ethernet, 6 bytes addrlen */
24*10465441SEvalZero 0x00, /* 0 hops */
25*10465441SEvalZero 0xAA, 0xAA, 0xAA, 0xAA, /* Transaction id, will be overwritten */
26*10465441SEvalZero 0x00, 0x00, /* 0 seconds elapsed */
27*10465441SEvalZero 0x00, 0x00, /* Flags (unicast) */
28*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, /* Client ip */
29*10465441SEvalZero 0xc3, 0xaa, 0xbd, 0xc8, /* Your IP */
30*10465441SEvalZero 0xc3, 0xaa, 0xbd, 0xab, /* DHCP server ip */
31*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, /* relay agent */
32*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* MAC addr + padding */
33*10465441SEvalZero
34*10465441SEvalZero /* Empty server name and boot file name */
35*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
36*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
38*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46*10465441SEvalZero 0x00, 0x00, 0x00, 0x00,
47*10465441SEvalZero
48*10465441SEvalZero 0x63, 0x82, 0x53, 0x63, /* Magic cookie */
49*10465441SEvalZero 0x35, 0x01, 0x02, /* Message type: Offer */
50*10465441SEvalZero 0x36, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Server identifier (IP) */
51*10465441SEvalZero 0x33, 0x04, 0x00, 0x00, 0x00, 0x78, /* Lease time 2 minutes */
52*10465441SEvalZero 0x03, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Router IP */
53*10465441SEvalZero 0x01, 0x04, 0xff, 0xff, 0xff, 0x00, /* Subnet mask */
54*10465441SEvalZero 0xff, /* End option */
55*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Padding */
57*10465441SEvalZero };
58*10465441SEvalZero
59*10465441SEvalZero static u8_t dhcp_ack[] = {
60*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, /* To unit */
61*10465441SEvalZero 0x00, 0x0f, 0xEE, 0x30, 0xAB, 0x22, /* From remote host */
62*10465441SEvalZero 0x08, 0x00, /* Proto IP */
63*10465441SEvalZero 0x45, 0x10, 0x01, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x36, 0xcc, 0xc3, 0xaa, 0xbd, 0xab, 0xc3, 0xaa, 0xbd, 0xc8, /* IP header */
64*10465441SEvalZero 0x00, 0x43, 0x00, 0x44, 0x01, 0x34, 0x00, 0x00, /* UDP header */
65*10465441SEvalZero 0x02, /* Bootp reply */
66*10465441SEvalZero 0x01, 0x06, /* Hw type Eth, len 6 */
67*10465441SEvalZero 0x00, /* 0 hops */
68*10465441SEvalZero 0xAA, 0xAA, 0xAA, 0xAA,
69*10465441SEvalZero 0x00, 0x00, /* 0 seconds elapsed */
70*10465441SEvalZero 0x00, 0x00, /* Flags (unicast) */
71*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, /* Client IP */
72*10465441SEvalZero 0xc3, 0xaa, 0xbd, 0xc8, /* Your IP */
73*10465441SEvalZero 0xc3, 0xaa, 0xbd, 0xab, /* DHCP server IP */
74*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, /* Relay agent */
75*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Macaddr + padding */
76*10465441SEvalZero
77*10465441SEvalZero /* Empty server name and boot file name */
78*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
79*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
82*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89*10465441SEvalZero 0x00, 0x00, 0x00, 0x00,
90*10465441SEvalZero
91*10465441SEvalZero 0x63, 0x82, 0x53, 0x63, /* Magic cookie */
92*10465441SEvalZero 0x35, 0x01, 0x05, /* Dhcp message type ack */
93*10465441SEvalZero 0x36, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* DHCP server identifier */
94*10465441SEvalZero 0x33, 0x04, 0x00, 0x00, 0x00, 0x78, /* Lease time 2 minutes */
95*10465441SEvalZero 0x03, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Router IP */
96*10465441SEvalZero 0x01, 0x04, 0xff, 0xff, 0xff, 0x00, /* Netmask */
97*10465441SEvalZero 0xff, /* End marker */
98*10465441SEvalZero
99*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Padding */
101*10465441SEvalZero };
102*10465441SEvalZero
103*10465441SEvalZero static const u8_t arpreply[] = {
104*10465441SEvalZero 0x00, 0x23, 0xC1, 0xDE, 0xD0, 0x0D, /* dst mac */
105*10465441SEvalZero 0x00, 0x32, 0x44, 0x20, 0x01, 0x02, /* src mac */
106*10465441SEvalZero 0x08, 0x06, /* proto arp */
107*10465441SEvalZero 0x00, 0x01, /* hw eth */
108*10465441SEvalZero 0x08, 0x00, /* proto ip */
109*10465441SEvalZero 0x06, /* hw addr len 6 */
110*10465441SEvalZero 0x04, /* proto addr len 4 */
111*10465441SEvalZero 0x00, 0x02, /* arp reply */
112*10465441SEvalZero 0x00, 0x32, 0x44, 0x20, 0x01, 0x02, /* sender mac */
113*10465441SEvalZero 0xc3, 0xaa, 0xbd, 0xc8, /* sender ip */
114*10465441SEvalZero 0x00, 0x23, 0xC1, 0xDE, 0xD0, 0x0D, /* target mac */
115*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, /* target ip */
116*10465441SEvalZero };
117*10465441SEvalZero
118*10465441SEvalZero static int txpacket;
119*10465441SEvalZero static enum tcase {
120*10465441SEvalZero TEST_LWIP_DHCP,
121*10465441SEvalZero TEST_LWIP_DHCP_NAK,
122*10465441SEvalZero TEST_LWIP_DHCP_RELAY,
123*10465441SEvalZero TEST_LWIP_DHCP_NAK_NO_ENDMARKER,
124*10465441SEvalZero TEST_LWIP_DHCP_INVALID_OVERLOAD,
125*10465441SEvalZero TEST_NONE
126*10465441SEvalZero } tcase;
127*10465441SEvalZero
128*10465441SEvalZero static int debug = 0;
setdebug(int a)129*10465441SEvalZero static void setdebug(int a) {debug = a;}
130*10465441SEvalZero
131*10465441SEvalZero static int tick = 0;
tick_lwip(void)132*10465441SEvalZero static void tick_lwip(void)
133*10465441SEvalZero {
134*10465441SEvalZero tick++;
135*10465441SEvalZero if (tick % 5 == 0) {
136*10465441SEvalZero dhcp_fine_tmr();
137*10465441SEvalZero }
138*10465441SEvalZero if (tick % 600 == 0) {
139*10465441SEvalZero dhcp_coarse_tmr();
140*10465441SEvalZero }
141*10465441SEvalZero }
142*10465441SEvalZero
send_pkt(struct netif * netif,const u8_t * data,size_t len)143*10465441SEvalZero static void send_pkt(struct netif *netif, const u8_t *data, size_t len)
144*10465441SEvalZero {
145*10465441SEvalZero struct pbuf *p, *q;
146*10465441SEvalZero LWIP_ASSERT("pkt too big", len <= 0xFFFF);
147*10465441SEvalZero p = pbuf_alloc(PBUF_RAW, (u16_t)len, PBUF_POOL);
148*10465441SEvalZero
149*10465441SEvalZero if (debug) {
150*10465441SEvalZero /* Dump data */
151*10465441SEvalZero u32_t i;
152*10465441SEvalZero printf("RX data (len %d)", p->tot_len);
153*10465441SEvalZero for (i = 0; i < len; i++) {
154*10465441SEvalZero printf(" %02X", data[i]);
155*10465441SEvalZero }
156*10465441SEvalZero printf("\n");
157*10465441SEvalZero }
158*10465441SEvalZero
159*10465441SEvalZero fail_unless(p != NULL);
160*10465441SEvalZero for(q = p; q != NULL; q = q->next) {
161*10465441SEvalZero memcpy(q->payload, data, q->len);
162*10465441SEvalZero data += q->len;
163*10465441SEvalZero }
164*10465441SEvalZero netif->input(p, netif);
165*10465441SEvalZero }
166*10465441SEvalZero
167*10465441SEvalZero static err_t lwip_tx_func(struct netif *netif, struct pbuf *p);
168*10465441SEvalZero
testif_init(struct netif * netif)169*10465441SEvalZero static err_t testif_init(struct netif *netif)
170*10465441SEvalZero {
171*10465441SEvalZero netif->name[0] = 'c';
172*10465441SEvalZero netif->name[1] = 'h';
173*10465441SEvalZero netif->output = etharp_output;
174*10465441SEvalZero netif->linkoutput = lwip_tx_func;
175*10465441SEvalZero netif->mtu = 1500;
176*10465441SEvalZero netif->hwaddr_len = 6;
177*10465441SEvalZero netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
178*10465441SEvalZero
179*10465441SEvalZero netif->hwaddr[0] = 0x00;
180*10465441SEvalZero netif->hwaddr[1] = 0x23;
181*10465441SEvalZero netif->hwaddr[2] = 0xC1;
182*10465441SEvalZero netif->hwaddr[3] = 0xDE;
183*10465441SEvalZero netif->hwaddr[4] = 0xD0;
184*10465441SEvalZero netif->hwaddr[5] = 0x0D;
185*10465441SEvalZero
186*10465441SEvalZero return ERR_OK;
187*10465441SEvalZero }
188*10465441SEvalZero
dhcp_setup(void)189*10465441SEvalZero static void dhcp_setup(void)
190*10465441SEvalZero {
191*10465441SEvalZero txpacket = 0;
192*10465441SEvalZero lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
193*10465441SEvalZero }
194*10465441SEvalZero
dhcp_teardown(void)195*10465441SEvalZero static void dhcp_teardown(void)
196*10465441SEvalZero {
197*10465441SEvalZero lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
198*10465441SEvalZero }
199*10465441SEvalZero
check_pkt(struct pbuf * p,u32_t pos,const u8_t * mem,u32_t len)200*10465441SEvalZero static void check_pkt(struct pbuf *p, u32_t pos, const u8_t *mem, u32_t len)
201*10465441SEvalZero {
202*10465441SEvalZero u8_t *data;
203*10465441SEvalZero
204*10465441SEvalZero fail_if((pos + len) > p->tot_len);
205*10465441SEvalZero while (pos > p->len && p->next) {
206*10465441SEvalZero pos -= p->len;
207*10465441SEvalZero p = p->next;
208*10465441SEvalZero }
209*10465441SEvalZero fail_if(p == NULL);
210*10465441SEvalZero fail_unless(pos + len <= p->len); /* All data we seek within same pbuf */
211*10465441SEvalZero
212*10465441SEvalZero data = (u8_t*)p->payload;
213*10465441SEvalZero fail_if(memcmp(&data[pos], mem, len), "data at pos %d, len %d in packet %d did not match", pos, len, txpacket);
214*10465441SEvalZero }
215*10465441SEvalZero
check_pkt_fuzzy(struct pbuf * p,u32_t startpos,const u8_t * mem,u32_t len)216*10465441SEvalZero static void check_pkt_fuzzy(struct pbuf *p, u32_t startpos, const u8_t *mem, u32_t len)
217*10465441SEvalZero {
218*10465441SEvalZero int found;
219*10465441SEvalZero u32_t i;
220*10465441SEvalZero u8_t *data;
221*10465441SEvalZero
222*10465441SEvalZero fail_if((startpos + len) > p->tot_len);
223*10465441SEvalZero while (startpos > p->len && p->next) {
224*10465441SEvalZero startpos -= p->len;
225*10465441SEvalZero p = p->next;
226*10465441SEvalZero }
227*10465441SEvalZero fail_if(p == NULL);
228*10465441SEvalZero fail_unless(startpos + len <= p->len); /* All data we seek within same pbuf */
229*10465441SEvalZero
230*10465441SEvalZero found = 0;
231*10465441SEvalZero data = (u8_t*)p->payload;
232*10465441SEvalZero for (i = startpos; i <= (p->len - len); i++) {
233*10465441SEvalZero if (memcmp(&data[i], mem, len) == 0) {
234*10465441SEvalZero found = 1;
235*10465441SEvalZero break;
236*10465441SEvalZero }
237*10465441SEvalZero }
238*10465441SEvalZero fail_unless(found);
239*10465441SEvalZero }
240*10465441SEvalZero
lwip_tx_func(struct netif * netif,struct pbuf * p)241*10465441SEvalZero static err_t lwip_tx_func(struct netif *netif, struct pbuf *p)
242*10465441SEvalZero {
243*10465441SEvalZero fail_unless(netif == &net_test);
244*10465441SEvalZero txpacket++;
245*10465441SEvalZero
246*10465441SEvalZero if (debug) {
247*10465441SEvalZero struct pbuf *pp = p;
248*10465441SEvalZero /* Dump data */
249*10465441SEvalZero printf("TX data (pkt %d, len %d, tick %d)", txpacket, p->tot_len, tick);
250*10465441SEvalZero do {
251*10465441SEvalZero int i;
252*10465441SEvalZero for (i = 0; i < pp->len; i++) {
253*10465441SEvalZero printf(" %02X", ((u8_t *) pp->payload)[i]);
254*10465441SEvalZero }
255*10465441SEvalZero if (pp->next) {
256*10465441SEvalZero pp = pp->next;
257*10465441SEvalZero }
258*10465441SEvalZero } while (pp->next);
259*10465441SEvalZero printf("\n");
260*10465441SEvalZero }
261*10465441SEvalZero
262*10465441SEvalZero switch (tcase) {
263*10465441SEvalZero case TEST_LWIP_DHCP:
264*10465441SEvalZero switch (txpacket) {
265*10465441SEvalZero case 1:
266*10465441SEvalZero case 2:
267*10465441SEvalZero {
268*10465441SEvalZero const u8_t ipproto[] = { 0x08, 0x00 };
269*10465441SEvalZero const u8_t bootp_start[] = { 0x01, 0x01, 0x06, 0x00}; /* bootp request, eth, hwaddr len 6, 0 hops */
270*10465441SEvalZero const u8_t ipaddrs[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
271*10465441SEvalZero
272*10465441SEvalZero check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */
273*10465441SEvalZero check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */
274*10465441SEvalZero
275*10465441SEvalZero check_pkt(p, 12, ipproto, sizeof(ipproto)); /* eth level proto: ip */
276*10465441SEvalZero
277*10465441SEvalZero check_pkt(p, 42, bootp_start, sizeof(bootp_start));
278*10465441SEvalZero
279*10465441SEvalZero check_pkt(p, 53, ipaddrs, sizeof(ipaddrs));
280*10465441SEvalZero
281*10465441SEvalZero check_pkt(p, 70, netif->hwaddr, 6); /* mac addr inside bootp */
282*10465441SEvalZero
283*10465441SEvalZero check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));
284*10465441SEvalZero
285*10465441SEvalZero /* Check dchp message type, can be at different positions */
286*10465441SEvalZero if (txpacket == 1) {
287*10465441SEvalZero u8_t dhcp_discover_opt[] = { 0x35, 0x01, 0x01 };
288*10465441SEvalZero check_pkt_fuzzy(p, 282, dhcp_discover_opt, sizeof(dhcp_discover_opt));
289*10465441SEvalZero } else if (txpacket == 2) {
290*10465441SEvalZero u8_t dhcp_request_opt[] = { 0x35, 0x01, 0x03 };
291*10465441SEvalZero u8_t requested_ipaddr[] = { 0x32, 0x04, 0xc3, 0xaa, 0xbd, 0xc8 }; /* Ask for offered IP */
292*10465441SEvalZero
293*10465441SEvalZero check_pkt_fuzzy(p, 282, dhcp_request_opt, sizeof(dhcp_request_opt));
294*10465441SEvalZero check_pkt_fuzzy(p, 282, requested_ipaddr, sizeof(requested_ipaddr));
295*10465441SEvalZero }
296*10465441SEvalZero break;
297*10465441SEvalZero }
298*10465441SEvalZero case 3:
299*10465441SEvalZero case 4:
300*10465441SEvalZero case 5:
301*10465441SEvalZero {
302*10465441SEvalZero const u8_t arpproto[] = { 0x08, 0x06 };
303*10465441SEvalZero
304*10465441SEvalZero check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */
305*10465441SEvalZero check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */
306*10465441SEvalZero
307*10465441SEvalZero check_pkt(p, 12, arpproto, sizeof(arpproto)); /* eth level proto: ip */
308*10465441SEvalZero break;
309*10465441SEvalZero }
310*10465441SEvalZero default:
311*10465441SEvalZero fail();
312*10465441SEvalZero break;
313*10465441SEvalZero }
314*10465441SEvalZero break;
315*10465441SEvalZero
316*10465441SEvalZero case TEST_LWIP_DHCP_NAK:
317*10465441SEvalZero {
318*10465441SEvalZero const u8_t ipproto[] = { 0x08, 0x00 };
319*10465441SEvalZero const u8_t bootp_start[] = { 0x01, 0x01, 0x06, 0x00}; /* bootp request, eth, hwaddr len 6, 0 hops */
320*10465441SEvalZero const u8_t ipaddrs[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
321*10465441SEvalZero const u8_t dhcp_nak_opt[] = { 0x35, 0x01, 0x04 };
322*10465441SEvalZero const u8_t requested_ipaddr[] = { 0x32, 0x04, 0xc3, 0xaa, 0xbd, 0xc8 }; /* offered IP */
323*10465441SEvalZero
324*10465441SEvalZero fail_unless(txpacket == 4);
325*10465441SEvalZero check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */
326*10465441SEvalZero check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */
327*10465441SEvalZero
328*10465441SEvalZero check_pkt(p, 12, ipproto, sizeof(ipproto)); /* eth level proto: ip */
329*10465441SEvalZero
330*10465441SEvalZero check_pkt(p, 42, bootp_start, sizeof(bootp_start));
331*10465441SEvalZero
332*10465441SEvalZero check_pkt(p, 53, ipaddrs, sizeof(ipaddrs));
333*10465441SEvalZero
334*10465441SEvalZero check_pkt(p, 70, netif->hwaddr, 6); /* mac addr inside bootp */
335*10465441SEvalZero
336*10465441SEvalZero check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));
337*10465441SEvalZero
338*10465441SEvalZero check_pkt_fuzzy(p, 282, dhcp_nak_opt, sizeof(dhcp_nak_opt)); /* NAK the ack */
339*10465441SEvalZero
340*10465441SEvalZero check_pkt_fuzzy(p, 282, requested_ipaddr, sizeof(requested_ipaddr));
341*10465441SEvalZero break;
342*10465441SEvalZero }
343*10465441SEvalZero
344*10465441SEvalZero case TEST_LWIP_DHCP_RELAY:
345*10465441SEvalZero switch (txpacket) {
346*10465441SEvalZero case 1:
347*10465441SEvalZero case 2:
348*10465441SEvalZero {
349*10465441SEvalZero const u8_t ipproto[] = { 0x08, 0x00 };
350*10465441SEvalZero const u8_t bootp_start[] = { 0x01, 0x01, 0x06, 0x00}; /* bootp request, eth, hwaddr len 6, 0 hops */
351*10465441SEvalZero const u8_t ipaddrs[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
352*10465441SEvalZero
353*10465441SEvalZero check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */
354*10465441SEvalZero check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */
355*10465441SEvalZero
356*10465441SEvalZero check_pkt(p, 12, ipproto, sizeof(ipproto)); /* eth level proto: ip */
357*10465441SEvalZero
358*10465441SEvalZero check_pkt(p, 42, bootp_start, sizeof(bootp_start));
359*10465441SEvalZero
360*10465441SEvalZero check_pkt(p, 53, ipaddrs, sizeof(ipaddrs));
361*10465441SEvalZero
362*10465441SEvalZero check_pkt(p, 70, netif->hwaddr, 6); /* mac addr inside bootp */
363*10465441SEvalZero
364*10465441SEvalZero check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));
365*10465441SEvalZero
366*10465441SEvalZero /* Check dchp message type, can be at different positions */
367*10465441SEvalZero if (txpacket == 1) {
368*10465441SEvalZero u8_t dhcp_discover_opt[] = { 0x35, 0x01, 0x01 };
369*10465441SEvalZero check_pkt_fuzzy(p, 282, dhcp_discover_opt, sizeof(dhcp_discover_opt));
370*10465441SEvalZero } else if (txpacket == 2) {
371*10465441SEvalZero u8_t dhcp_request_opt[] = { 0x35, 0x01, 0x03 };
372*10465441SEvalZero u8_t requested_ipaddr[] = { 0x32, 0x04, 0x4f, 0x8a, 0x33, 0x05 }; /* Ask for offered IP */
373*10465441SEvalZero
374*10465441SEvalZero check_pkt_fuzzy(p, 282, dhcp_request_opt, sizeof(dhcp_request_opt));
375*10465441SEvalZero check_pkt_fuzzy(p, 282, requested_ipaddr, sizeof(requested_ipaddr));
376*10465441SEvalZero }
377*10465441SEvalZero break;
378*10465441SEvalZero }
379*10465441SEvalZero case 3:
380*10465441SEvalZero case 4:
381*10465441SEvalZero case 5:
382*10465441SEvalZero case 6:
383*10465441SEvalZero {
384*10465441SEvalZero const u8_t arpproto[] = { 0x08, 0x06 };
385*10465441SEvalZero
386*10465441SEvalZero check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */
387*10465441SEvalZero check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */
388*10465441SEvalZero
389*10465441SEvalZero check_pkt(p, 12, arpproto, sizeof(arpproto)); /* eth level proto: ip */
390*10465441SEvalZero break;
391*10465441SEvalZero }
392*10465441SEvalZero case 7:
393*10465441SEvalZero {
394*10465441SEvalZero const u8_t fake_arp[6] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xab };
395*10465441SEvalZero const u8_t ipproto[] = { 0x08, 0x00 };
396*10465441SEvalZero const u8_t bootp_start[] = { 0x01, 0x01, 0x06, 0x00}; /* bootp request, eth, hwaddr len 6, 0 hops */
397*10465441SEvalZero const u8_t ipaddrs[] = { 0x00, 0x4f, 0x8a, 0x33, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
398*10465441SEvalZero const u8_t dhcp_request_opt[] = { 0x35, 0x01, 0x03 };
399*10465441SEvalZero
400*10465441SEvalZero check_pkt(p, 0, fake_arp, 6); /* eth level dest: broadcast */
401*10465441SEvalZero check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */
402*10465441SEvalZero
403*10465441SEvalZero check_pkt(p, 12, ipproto, sizeof(ipproto)); /* eth level proto: ip */
404*10465441SEvalZero
405*10465441SEvalZero check_pkt(p, 42, bootp_start, sizeof(bootp_start));
406*10465441SEvalZero
407*10465441SEvalZero check_pkt(p, 53, ipaddrs, sizeof(ipaddrs));
408*10465441SEvalZero
409*10465441SEvalZero check_pkt(p, 70, netif->hwaddr, 6); /* mac addr inside bootp */
410*10465441SEvalZero
411*10465441SEvalZero check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));
412*10465441SEvalZero
413*10465441SEvalZero /* Check dchp message type, can be at different positions */
414*10465441SEvalZero check_pkt_fuzzy(p, 282, dhcp_request_opt, sizeof(dhcp_request_opt));
415*10465441SEvalZero break;
416*10465441SEvalZero }
417*10465441SEvalZero default:
418*10465441SEvalZero fail();
419*10465441SEvalZero break;
420*10465441SEvalZero }
421*10465441SEvalZero break;
422*10465441SEvalZero
423*10465441SEvalZero default:
424*10465441SEvalZero break;
425*10465441SEvalZero }
426*10465441SEvalZero
427*10465441SEvalZero return ERR_OK;
428*10465441SEvalZero }
429*10465441SEvalZero
430*10465441SEvalZero /*
431*10465441SEvalZero * Test basic happy flow DHCP session.
432*10465441SEvalZero * Validate that xid is checked.
433*10465441SEvalZero */
START_TEST(test_dhcp)434*10465441SEvalZero START_TEST(test_dhcp)
435*10465441SEvalZero {
436*10465441SEvalZero ip4_addr_t addr;
437*10465441SEvalZero ip4_addr_t netmask;
438*10465441SEvalZero ip4_addr_t gw;
439*10465441SEvalZero int i;
440*10465441SEvalZero u32_t xid;
441*10465441SEvalZero LWIP_UNUSED_ARG(_i);
442*10465441SEvalZero
443*10465441SEvalZero tcase = TEST_LWIP_DHCP;
444*10465441SEvalZero setdebug(0);
445*10465441SEvalZero
446*10465441SEvalZero IP4_ADDR(&addr, 0, 0, 0, 0);
447*10465441SEvalZero IP4_ADDR(&netmask, 0, 0, 0, 0);
448*10465441SEvalZero IP4_ADDR(&gw, 0, 0, 0, 0);
449*10465441SEvalZero
450*10465441SEvalZero netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
451*10465441SEvalZero netif_set_link_up(&net_test);
452*10465441SEvalZero netif_set_up(&net_test);
453*10465441SEvalZero
454*10465441SEvalZero dhcp_start(&net_test);
455*10465441SEvalZero
456*10465441SEvalZero fail_unless(txpacket == 1); /* DHCP discover sent */
457*10465441SEvalZero xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */
458*10465441SEvalZero memcpy(&dhcp_offer[46], &xid, 4);
459*10465441SEvalZero send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));
460*10465441SEvalZero
461*10465441SEvalZero /* IP addresses should be zero */
462*10465441SEvalZero fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));
463*10465441SEvalZero fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
464*10465441SEvalZero fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
465*10465441SEvalZero
466*10465441SEvalZero fail_unless(txpacket == 1, "TX %d packets, expected 1", txpacket); /* Nothing more sent */
467*10465441SEvalZero xid = htonl(netif_dhcp_data(&net_test)->xid);
468*10465441SEvalZero memcpy(&dhcp_offer[46], &xid, 4); /* insert correct transaction id */
469*10465441SEvalZero send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));
470*10465441SEvalZero
471*10465441SEvalZero fail_unless(txpacket == 2, "TX %d packets, expected 2", txpacket); /* DHCP request sent */
472*10465441SEvalZero xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */
473*10465441SEvalZero memcpy(&dhcp_ack[46], &xid, 4);
474*10465441SEvalZero send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));
475*10465441SEvalZero
476*10465441SEvalZero fail_unless(txpacket == 2, "TX %d packets, still expected 2", txpacket); /* No more sent */
477*10465441SEvalZero xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
478*10465441SEvalZero memcpy(&dhcp_ack[46], &xid, 4); /* insert transaction id */
479*10465441SEvalZero send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));
480*10465441SEvalZero
481*10465441SEvalZero for (i = 0; i < 20; i++) {
482*10465441SEvalZero tick_lwip();
483*10465441SEvalZero }
484*10465441SEvalZero fail_unless(txpacket == 5, "TX %d packets, expected 5", txpacket); /* ARP requests sent */
485*10465441SEvalZero
486*10465441SEvalZero /* Interface up */
487*10465441SEvalZero fail_unless(netif_is_up(&net_test));
488*10465441SEvalZero
489*10465441SEvalZero /* Now it should have taken the IP */
490*10465441SEvalZero IP4_ADDR(&addr, 195, 170, 189, 200);
491*10465441SEvalZero IP4_ADDR(&netmask, 255, 255, 255, 0);
492*10465441SEvalZero IP4_ADDR(&gw, 195, 170, 189, 171);
493*10465441SEvalZero fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));
494*10465441SEvalZero fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
495*10465441SEvalZero fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
496*10465441SEvalZero
497*10465441SEvalZero tcase = TEST_NONE;
498*10465441SEvalZero dhcp_stop(&net_test);
499*10465441SEvalZero dhcp_cleanup(&net_test);
500*10465441SEvalZero netif_remove(&net_test);
501*10465441SEvalZero }
502*10465441SEvalZero END_TEST
503*10465441SEvalZero
504*10465441SEvalZero /*
505*10465441SEvalZero * Test that IP address is not taken and NAK is sent if someone
506*10465441SEvalZero * replies to ARP requests for the offered address.
507*10465441SEvalZero */
START_TEST(test_dhcp_nak)508*10465441SEvalZero START_TEST(test_dhcp_nak)
509*10465441SEvalZero {
510*10465441SEvalZero ip4_addr_t addr;
511*10465441SEvalZero ip4_addr_t netmask;
512*10465441SEvalZero ip4_addr_t gw;
513*10465441SEvalZero u32_t xid;
514*10465441SEvalZero LWIP_UNUSED_ARG(_i);
515*10465441SEvalZero
516*10465441SEvalZero tcase = TEST_LWIP_DHCP;
517*10465441SEvalZero setdebug(0);
518*10465441SEvalZero
519*10465441SEvalZero IP4_ADDR(&addr, 0, 0, 0, 0);
520*10465441SEvalZero IP4_ADDR(&netmask, 0, 0, 0, 0);
521*10465441SEvalZero IP4_ADDR(&gw, 0, 0, 0, 0);
522*10465441SEvalZero
523*10465441SEvalZero netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
524*10465441SEvalZero netif_set_link_up(&net_test);
525*10465441SEvalZero netif_set_up(&net_test);
526*10465441SEvalZero
527*10465441SEvalZero dhcp_start(&net_test);
528*10465441SEvalZero
529*10465441SEvalZero fail_unless(txpacket == 1); /* DHCP discover sent */
530*10465441SEvalZero xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */
531*10465441SEvalZero memcpy(&dhcp_offer[46], &xid, 4);
532*10465441SEvalZero send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));
533*10465441SEvalZero
534*10465441SEvalZero /* IP addresses should be zero */
535*10465441SEvalZero fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));
536*10465441SEvalZero fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
537*10465441SEvalZero fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
538*10465441SEvalZero
539*10465441SEvalZero fail_unless(txpacket == 1); /* Nothing more sent */
540*10465441SEvalZero xid = htonl(netif_dhcp_data(&net_test)->xid);
541*10465441SEvalZero memcpy(&dhcp_offer[46], &xid, 4); /* insert correct transaction id */
542*10465441SEvalZero send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));
543*10465441SEvalZero
544*10465441SEvalZero fail_unless(txpacket == 2); /* DHCP request sent */
545*10465441SEvalZero xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */
546*10465441SEvalZero memcpy(&dhcp_ack[46], &xid, 4);
547*10465441SEvalZero send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));
548*10465441SEvalZero
549*10465441SEvalZero fail_unless(txpacket == 2); /* No more sent */
550*10465441SEvalZero xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
551*10465441SEvalZero memcpy(&dhcp_ack[46], &xid, 4); /* insert transaction id */
552*10465441SEvalZero send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));
553*10465441SEvalZero
554*10465441SEvalZero fail_unless(txpacket == 3); /* ARP request sent */
555*10465441SEvalZero
556*10465441SEvalZero tcase = TEST_LWIP_DHCP_NAK; /* Switch testcase */
557*10465441SEvalZero
558*10465441SEvalZero /* Send arp reply, mark offered IP as taken */
559*10465441SEvalZero send_pkt(&net_test, arpreply, sizeof(arpreply));
560*10465441SEvalZero
561*10465441SEvalZero fail_unless(txpacket == 4); /* DHCP nak sent */
562*10465441SEvalZero
563*10465441SEvalZero tcase = TEST_NONE;
564*10465441SEvalZero dhcp_stop(&net_test);
565*10465441SEvalZero dhcp_cleanup(&net_test);
566*10465441SEvalZero netif_remove(&net_test);
567*10465441SEvalZero }
568*10465441SEvalZero END_TEST
569*10465441SEvalZero
570*10465441SEvalZero /*
571*10465441SEvalZero * Test case based on captured data where
572*10465441SEvalZero * replies are sent from a different IP than the
573*10465441SEvalZero * one the client unicasted to.
574*10465441SEvalZero */
START_TEST(test_dhcp_relayed)575*10465441SEvalZero START_TEST(test_dhcp_relayed)
576*10465441SEvalZero {
577*10465441SEvalZero u8_t relay_offer[] = {
578*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d,
579*10465441SEvalZero 0x00, 0x22, 0x93, 0x5a, 0xf7, 0x60,
580*10465441SEvalZero 0x08, 0x00, 0x45, 0x00,
581*10465441SEvalZero 0x01, 0x38, 0xfd, 0x53, 0x00, 0x00, 0x40, 0x11,
582*10465441SEvalZero 0x78, 0x46, 0x4f, 0x8a, 0x32, 0x02, 0x4f, 0x8a,
583*10465441SEvalZero 0x33, 0x05, 0x00, 0x43, 0x00, 0x44, 0x01, 0x24,
584*10465441SEvalZero 0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x51, 0x35,
585*10465441SEvalZero 0xb6, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
586*10465441SEvalZero 0x00, 0x00, 0x4f, 0x8a, 0x33, 0x05, 0x00, 0x00,
587*10465441SEvalZero 0x00, 0x00, 0x0a, 0xb5, 0x04, 0x01, 0x00, 0x23,
588*10465441SEvalZero 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00,
589*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
590*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
591*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
592*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
593*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
594*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
595*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
596*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
597*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
598*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
599*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
600*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
601*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
602*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
603*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
605*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
607*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
608*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
609*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
611*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
612*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
613*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,
614*10465441SEvalZero 0x53, 0x63, 0x01, 0x04, 0xff, 0xff, 0xfe, 0x00,
615*10465441SEvalZero 0x03, 0x04, 0x4f, 0x8a, 0x32, 0x01, 0x06, 0x08,
616*10465441SEvalZero 0x4f, 0x8a, 0x00, 0xb4, 0x55, 0x08, 0x1f, 0xd1,
617*10465441SEvalZero 0x1c, 0x04, 0x4f, 0x8a, 0x33, 0xff, 0x33, 0x04,
618*10465441SEvalZero 0x00, 0x00, 0x54, 0x49, 0x35, 0x01, 0x02, 0x36,
619*10465441SEvalZero 0x04, 0x0a, 0xb5, 0x04, 0x01, 0xff
620*10465441SEvalZero };
621*10465441SEvalZero
622*10465441SEvalZero u8_t relay_ack1[] = {
623*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x22,
624*10465441SEvalZero 0x93, 0x5a, 0xf7, 0x60, 0x08, 0x00, 0x45, 0x00,
625*10465441SEvalZero 0x01, 0x38, 0xfd, 0x55, 0x00, 0x00, 0x40, 0x11,
626*10465441SEvalZero 0x78, 0x44, 0x4f, 0x8a, 0x32, 0x02, 0x4f, 0x8a,
627*10465441SEvalZero 0x33, 0x05, 0x00, 0x43, 0x00, 0x44, 0x01, 0x24,
628*10465441SEvalZero 0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x51, 0x35,
629*10465441SEvalZero 0xb6, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
630*10465441SEvalZero 0x00, 0x00, 0x4f, 0x8a, 0x33, 0x05, 0x00, 0x00,
631*10465441SEvalZero 0x00, 0x00, 0x0a, 0xb5, 0x04, 0x01, 0x00, 0x23,
632*10465441SEvalZero 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00,
633*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
634*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
635*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
636*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
637*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
638*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
639*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
640*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
641*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
642*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
643*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
644*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
645*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
647*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
648*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
649*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
650*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
651*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
653*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
655*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,
658*10465441SEvalZero 0x53, 0x63, 0x01, 0x04, 0xff, 0xff, 0xfe, 0x00,
659*10465441SEvalZero 0x03, 0x04, 0x4f, 0x8a, 0x32, 0x01, 0x06, 0x08,
660*10465441SEvalZero 0x4f, 0x8a, 0x00, 0xb4, 0x55, 0x08, 0x1f, 0xd1,
661*10465441SEvalZero 0x1c, 0x04, 0x4f, 0x8a, 0x33, 0xff, 0x33, 0x04,
662*10465441SEvalZero 0x00, 0x00, 0x54, 0x49, 0x35, 0x01, 0x05, 0x36,
663*10465441SEvalZero 0x04, 0x0a, 0xb5, 0x04, 0x01, 0xff
664*10465441SEvalZero };
665*10465441SEvalZero
666*10465441SEvalZero u8_t relay_ack2[] = {
667*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d,
668*10465441SEvalZero 0x00, 0x22, 0x93, 0x5a, 0xf7, 0x60,
669*10465441SEvalZero 0x08, 0x00, 0x45, 0x00,
670*10465441SEvalZero 0x01, 0x38, 0xfa, 0x18, 0x00, 0x00, 0x40, 0x11,
671*10465441SEvalZero 0x7b, 0x81, 0x4f, 0x8a, 0x32, 0x02, 0x4f, 0x8a,
672*10465441SEvalZero 0x33, 0x05, 0x00, 0x43, 0x00, 0x44, 0x01, 0x24,
673*10465441SEvalZero 0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x49, 0x8b,
674*10465441SEvalZero 0x6e, 0xab, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x8a,
675*10465441SEvalZero 0x33, 0x05, 0x4f, 0x8a, 0x33, 0x05, 0x00, 0x00,
676*10465441SEvalZero 0x00, 0x00, 0x0a, 0xb5, 0x04, 0x01, 0x00, 0x23,
677*10465441SEvalZero 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00,
678*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
679*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
680*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
681*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
682*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
683*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
684*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
685*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
686*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
687*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
688*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
689*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
690*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
691*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
693*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
694*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
695*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
696*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
697*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
698*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
699*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
700*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
701*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
702*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,
703*10465441SEvalZero 0x53, 0x63, 0x01, 0x04, 0xff, 0xff, 0xfe, 0x00,
704*10465441SEvalZero 0x03, 0x04, 0x4f, 0x8a, 0x32, 0x01, 0x06, 0x08,
705*10465441SEvalZero 0x4f, 0x8a, 0x00, 0xb4, 0x55, 0x08, 0x1f, 0xd1,
706*10465441SEvalZero 0x1c, 0x04, 0x4f, 0x8a, 0x33, 0xff, 0x33, 0x04,
707*10465441SEvalZero 0x00, 0x00, 0x54, 0x60, 0x35, 0x01, 0x05, 0x36,
708*10465441SEvalZero 0x04, 0x0a, 0xb5, 0x04, 0x01, 0xff };
709*10465441SEvalZero
710*10465441SEvalZero const u8_t arp_resp[] = {
711*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, /* DEST */
712*10465441SEvalZero 0x00, 0x22, 0x93, 0x5a, 0xf7, 0x60, /* SRC */
713*10465441SEvalZero 0x08, 0x06, /* Type: ARP */
714*10465441SEvalZero 0x00, 0x01, /* HW: Ethernet */
715*10465441SEvalZero 0x08, 0x00, /* PROTO: IP */
716*10465441SEvalZero 0x06, /* HW size */
717*10465441SEvalZero 0x04, /* PROTO size */
718*10465441SEvalZero 0x00, 0x02, /* OPCODE: Reply */
719*10465441SEvalZero
720*10465441SEvalZero 0x12, 0x34, 0x56, 0x78, 0x9a, 0xab, /* Target MAC */
721*10465441SEvalZero 0x4f, 0x8a, 0x32, 0x01, /* Target IP */
722*10465441SEvalZero
723*10465441SEvalZero 0x00, 0x23, 0xc1, 0x00, 0x06, 0x50, /* src mac */
724*10465441SEvalZero 0x4f, 0x8a, 0x33, 0x05, /* src ip */
725*10465441SEvalZero
726*10465441SEvalZero /* Padding follows.. */
727*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
728*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
729*10465441SEvalZero 0x00, 0x00, 0x00, 0x00 };
730*10465441SEvalZero
731*10465441SEvalZero ip4_addr_t addr;
732*10465441SEvalZero ip4_addr_t netmask;
733*10465441SEvalZero ip4_addr_t gw;
734*10465441SEvalZero int i;
735*10465441SEvalZero u32_t xid;
736*10465441SEvalZero LWIP_UNUSED_ARG(_i);
737*10465441SEvalZero
738*10465441SEvalZero tcase = TEST_LWIP_DHCP_RELAY;
739*10465441SEvalZero setdebug(0);
740*10465441SEvalZero
741*10465441SEvalZero IP4_ADDR(&addr, 0, 0, 0, 0);
742*10465441SEvalZero IP4_ADDR(&netmask, 0, 0, 0, 0);
743*10465441SEvalZero IP4_ADDR(&gw, 0, 0, 0, 0);
744*10465441SEvalZero
745*10465441SEvalZero netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
746*10465441SEvalZero netif_set_link_up(&net_test);
747*10465441SEvalZero netif_set_up(&net_test);
748*10465441SEvalZero
749*10465441SEvalZero dhcp_start(&net_test);
750*10465441SEvalZero
751*10465441SEvalZero fail_unless(txpacket == 1); /* DHCP discover sent */
752*10465441SEvalZero
753*10465441SEvalZero /* IP addresses should be zero */
754*10465441SEvalZero fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));
755*10465441SEvalZero fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
756*10465441SEvalZero fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
757*10465441SEvalZero
758*10465441SEvalZero fail_unless(txpacket == 1); /* Nothing more sent */
759*10465441SEvalZero xid = htonl(netif_dhcp_data(&net_test)->xid);
760*10465441SEvalZero memcpy(&relay_offer[46], &xid, 4); /* insert correct transaction id */
761*10465441SEvalZero send_pkt(&net_test, relay_offer, sizeof(relay_offer));
762*10465441SEvalZero
763*10465441SEvalZero /* request sent? */
764*10465441SEvalZero fail_unless(txpacket == 2, "txpkt = %d, should be 2", txpacket);
765*10465441SEvalZero xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
766*10465441SEvalZero memcpy(&relay_ack1[46], &xid, 4); /* insert transaction id */
767*10465441SEvalZero send_pkt(&net_test, relay_ack1, sizeof(relay_ack1));
768*10465441SEvalZero
769*10465441SEvalZero for (i = 0; i < 25; i++) {
770*10465441SEvalZero tick_lwip();
771*10465441SEvalZero }
772*10465441SEvalZero fail_unless(txpacket == 5, "txpkt should be 5, is %d", txpacket); /* ARP requests sent */
773*10465441SEvalZero
774*10465441SEvalZero /* Interface up */
775*10465441SEvalZero fail_unless(netif_is_up(&net_test));
776*10465441SEvalZero
777*10465441SEvalZero /* Now it should have taken the IP */
778*10465441SEvalZero IP4_ADDR(&addr, 79, 138, 51, 5);
779*10465441SEvalZero IP4_ADDR(&netmask, 255, 255, 254, 0);
780*10465441SEvalZero IP4_ADDR(&gw, 79, 138, 50, 1);
781*10465441SEvalZero fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));
782*10465441SEvalZero fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
783*10465441SEvalZero fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
784*10465441SEvalZero
785*10465441SEvalZero fail_unless(txpacket == 5, "txpacket = %d", txpacket);
786*10465441SEvalZero
787*10465441SEvalZero for (i = 0; i < 108000 - 25; i++) {
788*10465441SEvalZero tick_lwip();
789*10465441SEvalZero }
790*10465441SEvalZero
791*10465441SEvalZero fail_unless(netif_is_up(&net_test));
792*10465441SEvalZero fail_unless(txpacket == 6, "txpacket = %d", txpacket);
793*10465441SEvalZero
794*10465441SEvalZero /* We need to send arp response here.. */
795*10465441SEvalZero
796*10465441SEvalZero send_pkt(&net_test, arp_resp, sizeof(arp_resp));
797*10465441SEvalZero
798*10465441SEvalZero fail_unless(txpacket == 7, "txpacket = %d", txpacket);
799*10465441SEvalZero fail_unless(netif_is_up(&net_test));
800*10465441SEvalZero
801*10465441SEvalZero xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
802*10465441SEvalZero memcpy(&relay_ack2[46], &xid, 4); /* insert transaction id */
803*10465441SEvalZero send_pkt(&net_test, relay_ack2, sizeof(relay_ack2));
804*10465441SEvalZero
805*10465441SEvalZero for (i = 0; i < 100000; i++) {
806*10465441SEvalZero tick_lwip();
807*10465441SEvalZero }
808*10465441SEvalZero
809*10465441SEvalZero fail_unless(txpacket == 7, "txpacket = %d", txpacket);
810*10465441SEvalZero
811*10465441SEvalZero tcase = TEST_NONE;
812*10465441SEvalZero dhcp_stop(&net_test);
813*10465441SEvalZero dhcp_cleanup(&net_test);
814*10465441SEvalZero netif_remove(&net_test);
815*10465441SEvalZero
816*10465441SEvalZero }
817*10465441SEvalZero END_TEST
818*10465441SEvalZero
START_TEST(test_dhcp_nak_no_endmarker)819*10465441SEvalZero START_TEST(test_dhcp_nak_no_endmarker)
820*10465441SEvalZero {
821*10465441SEvalZero ip4_addr_t addr;
822*10465441SEvalZero ip4_addr_t netmask;
823*10465441SEvalZero ip4_addr_t gw;
824*10465441SEvalZero
825*10465441SEvalZero u8_t dhcp_nack_no_endmarker[] = {
826*10465441SEvalZero 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0x75,
827*10465441SEvalZero 0xd0, 0x26, 0xd0, 0x0d, 0x08, 0x00, 0x45, 0x00,
828*10465441SEvalZero 0x01, 0x15, 0x38, 0x86, 0x00, 0x00, 0xff, 0x11,
829*10465441SEvalZero 0xc0, 0xa8, 0xc0, 0xa8, 0x01, 0x01, 0xff, 0xff,
830*10465441SEvalZero 0xff, 0xff, 0x00, 0x43, 0x00, 0x44, 0x01, 0x01,
831*10465441SEvalZero 0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x7a, 0xcb,
832*10465441SEvalZero 0xba, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
833*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
834*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23,
835*10465441SEvalZero 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00,
836*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
837*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
838*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
839*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
841*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
842*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
843*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
844*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
845*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
846*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
848*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
849*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
851*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
852*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
853*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
854*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
855*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
856*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
858*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
859*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
860*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,
861*10465441SEvalZero 0x53, 0x63, 0x35, 0x01, 0x06, 0x36, 0x04, 0xc0,
862*10465441SEvalZero 0xa8, 0x01, 0x01, 0x31, 0xef, 0xad, 0x72, 0x31,
863*10465441SEvalZero 0x43, 0x4e, 0x44, 0x30, 0x32, 0x35, 0x30, 0x43,
864*10465441SEvalZero 0x52, 0x47, 0x44, 0x38, 0x35, 0x36, 0x3c, 0x08,
865*10465441SEvalZero 0x4d, 0x53, 0x46, 0x54, 0x20, 0x35, 0x2e, 0x30,
866*10465441SEvalZero 0x37, 0x0d, 0x01, 0x0f, 0x03, 0x06, 0x2c, 0x2e,
867*10465441SEvalZero 0x2f, 0x1f, 0x21, 0x79, 0xf9, 0x2b, 0xfc, 0xff,
868*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x71,
869*10465441SEvalZero 0xf3, 0x5b, 0xe2, 0x71, 0x2e, 0x01, 0x08, 0x03,
870*10465441SEvalZero 0x04, 0xc0, 0xa8, 0x01, 0x01, 0xff, 0xeb, 0x1e,
871*10465441SEvalZero 0x44, 0xec, 0xeb, 0x1e, 0x30, 0x37, 0x0c, 0x01,
872*10465441SEvalZero 0x0f, 0x03, 0x06, 0x2c, 0x2e, 0x2f, 0x1f, 0x21,
873*10465441SEvalZero 0x79, 0xf9, 0x2b, 0xff, 0x25, 0xc0, 0x09, 0xd6,
874*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
875*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
876*10465441SEvalZero };
877*10465441SEvalZero u32_t xid;
878*10465441SEvalZero struct dhcp* dhcp;
879*10465441SEvalZero u8_t tries;
880*10465441SEvalZero u16_t request_timeout;
881*10465441SEvalZero LWIP_UNUSED_ARG(_i);
882*10465441SEvalZero
883*10465441SEvalZero tcase = TEST_LWIP_DHCP_NAK_NO_ENDMARKER;
884*10465441SEvalZero setdebug(0);
885*10465441SEvalZero
886*10465441SEvalZero IP4_ADDR(&addr, 0, 0, 0, 0);
887*10465441SEvalZero IP4_ADDR(&netmask, 0, 0, 0, 0);
888*10465441SEvalZero IP4_ADDR(&gw, 0, 0, 0, 0);
889*10465441SEvalZero
890*10465441SEvalZero netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
891*10465441SEvalZero netif_set_link_up(&net_test);
892*10465441SEvalZero netif_set_up(&net_test);
893*10465441SEvalZero
894*10465441SEvalZero dhcp_start(&net_test);
895*10465441SEvalZero dhcp = netif_dhcp_data(&net_test);
896*10465441SEvalZero
897*10465441SEvalZero fail_unless(txpacket == 1); /* DHCP discover sent */
898*10465441SEvalZero xid = dhcp->xid; /* Write bad xid, not using htonl! */
899*10465441SEvalZero memcpy(&dhcp_offer[46], &xid, 4);
900*10465441SEvalZero send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));
901*10465441SEvalZero
902*10465441SEvalZero /* IP addresses should be zero */
903*10465441SEvalZero fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));
904*10465441SEvalZero fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
905*10465441SEvalZero fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
906*10465441SEvalZero
907*10465441SEvalZero fail_unless(txpacket == 1); /* Nothing more sent */
908*10465441SEvalZero xid = htonl(dhcp->xid);
909*10465441SEvalZero memcpy(&dhcp_offer[46], &xid, 4); /* insert correct transaction id */
910*10465441SEvalZero send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));
911*10465441SEvalZero
912*10465441SEvalZero fail_unless(dhcp->state == DHCP_STATE_REQUESTING);
913*10465441SEvalZero
914*10465441SEvalZero fail_unless(txpacket == 2); /* No more sent */
915*10465441SEvalZero xid = htonl(dhcp->xid); /* xid updated */
916*10465441SEvalZero memcpy(&dhcp_nack_no_endmarker[46], &xid, 4); /* insert transaction id */
917*10465441SEvalZero tries = dhcp->tries;
918*10465441SEvalZero request_timeout = dhcp->request_timeout;
919*10465441SEvalZero send_pkt(&net_test, dhcp_nack_no_endmarker, sizeof(dhcp_nack_no_endmarker));
920*10465441SEvalZero
921*10465441SEvalZero /* NAK should be ignored */
922*10465441SEvalZero fail_unless(dhcp->state == DHCP_STATE_REQUESTING);
923*10465441SEvalZero fail_unless(txpacket == 2); /* No more sent */
924*10465441SEvalZero fail_unless(xid == htonl(dhcp->xid));
925*10465441SEvalZero fail_unless(tries == dhcp->tries);
926*10465441SEvalZero fail_unless(request_timeout == dhcp->request_timeout);
927*10465441SEvalZero
928*10465441SEvalZero tcase = TEST_NONE;
929*10465441SEvalZero dhcp_stop(&net_test);
930*10465441SEvalZero dhcp_cleanup(&net_test);
931*10465441SEvalZero netif_remove(&net_test);
932*10465441SEvalZero }
933*10465441SEvalZero END_TEST
934*10465441SEvalZero
START_TEST(test_dhcp_invalid_overload)935*10465441SEvalZero START_TEST(test_dhcp_invalid_overload)
936*10465441SEvalZero {
937*10465441SEvalZero u8_t dhcp_offer_invalid_overload[] = {
938*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, /* To unit */
939*10465441SEvalZero 0x00, 0x0F, 0xEE, 0x30, 0xAB, 0x22, /* From Remote host */
940*10465441SEvalZero 0x08, 0x00, /* Protocol: IP */
941*10465441SEvalZero 0x45, 0x10, 0x01, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x36, 0xcc, 0xc3, 0xaa, 0xbd, 0xab, 0xc3, 0xaa, 0xbd, 0xc8, /* IP header */
942*10465441SEvalZero 0x00, 0x43, 0x00, 0x44, 0x01, 0x34, 0x00, 0x00, /* UDP header */
943*10465441SEvalZero
944*10465441SEvalZero 0x02, /* Type == Boot reply */
945*10465441SEvalZero 0x01, 0x06, /* Hw Ethernet, 6 bytes addrlen */
946*10465441SEvalZero 0x00, /* 0 hops */
947*10465441SEvalZero 0xAA, 0xAA, 0xAA, 0xAA, /* Transaction id, will be overwritten */
948*10465441SEvalZero 0x00, 0x00, /* 0 seconds elapsed */
949*10465441SEvalZero 0x00, 0x00, /* Flags (unicast) */
950*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, /* Client ip */
951*10465441SEvalZero 0xc3, 0xaa, 0xbd, 0xc8, /* Your IP */
952*10465441SEvalZero 0xc3, 0xaa, 0xbd, 0xab, /* DHCP server ip */
953*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, /* relay agent */
954*10465441SEvalZero 0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* MAC addr + padding */
955*10465441SEvalZero
956*10465441SEvalZero /* Empty server name */
957*10465441SEvalZero 0x34, 0x01, 0x02, 0xff, /* Overload: SNAME + END */
958*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
959*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
960*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
962*10465441SEvalZero /* Empty boot file name */
963*10465441SEvalZero 0x34, 0x01, 0x01, 0xff, /* Overload FILE + END */
964*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
965*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
966*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
967*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
968*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
969*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
971*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972*10465441SEvalZero
973*10465441SEvalZero 0x63, 0x82, 0x53, 0x63, /* Magic cookie */
974*10465441SEvalZero 0x35, 0x01, 0x02, /* Message type: Offer */
975*10465441SEvalZero 0x36, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Server identifier (IP) */
976*10465441SEvalZero 0x33, 0x04, 0x00, 0x00, 0x00, 0x78, /* Lease time 2 minutes */
977*10465441SEvalZero 0x03, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Router IP */
978*10465441SEvalZero 0x01, 0x04, 0xff, 0xff, 0xff, 0x00, /* Subnet mask */
979*10465441SEvalZero 0x34, 0x01, 0x03, /* Overload: FILE + SNAME */
980*10465441SEvalZero 0xff, /* End option */
981*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
982*10465441SEvalZero 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Padding */
983*10465441SEvalZero };
984*10465441SEvalZero ip4_addr_t addr;
985*10465441SEvalZero ip4_addr_t netmask;
986*10465441SEvalZero ip4_addr_t gw;
987*10465441SEvalZero u32_t xid;
988*10465441SEvalZero LWIP_UNUSED_ARG(_i);
989*10465441SEvalZero
990*10465441SEvalZero tcase = TEST_LWIP_DHCP_INVALID_OVERLOAD;
991*10465441SEvalZero setdebug(0);
992*10465441SEvalZero
993*10465441SEvalZero IP4_ADDR(&addr, 0, 0, 0, 0);
994*10465441SEvalZero IP4_ADDR(&netmask, 0, 0, 0, 0);
995*10465441SEvalZero IP4_ADDR(&gw, 0, 0, 0, 0);
996*10465441SEvalZero
997*10465441SEvalZero netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
998*10465441SEvalZero netif_set_link_up(&net_test);
999*10465441SEvalZero netif_set_up(&net_test);
1000*10465441SEvalZero
1001*10465441SEvalZero dhcp_start(&net_test);
1002*10465441SEvalZero
1003*10465441SEvalZero fail_unless(txpacket == 1); /* DHCP discover sent */
1004*10465441SEvalZero xid = htonl(netif_dhcp_data(&net_test)->xid);
1005*10465441SEvalZero memcpy(&dhcp_offer_invalid_overload[46], &xid, 4); /* insert correct transaction id */
1006*10465441SEvalZero dhcp_offer_invalid_overload[311] = 3;
1007*10465441SEvalZero send_pkt(&net_test, dhcp_offer_invalid_overload, sizeof(dhcp_offer_invalid_overload));
1008*10465441SEvalZero /* IP addresses should be zero */
1009*10465441SEvalZero fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));
1010*10465441SEvalZero fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
1011*10465441SEvalZero fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
1012*10465441SEvalZero fail_unless(txpacket == 1); /* Nothing more sent */
1013*10465441SEvalZero
1014*10465441SEvalZero dhcp_offer_invalid_overload[311] = 2;
1015*10465441SEvalZero send_pkt(&net_test, dhcp_offer_invalid_overload, sizeof(dhcp_offer_invalid_overload));
1016*10465441SEvalZero /* IP addresses should be zero */
1017*10465441SEvalZero fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));
1018*10465441SEvalZero fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
1019*10465441SEvalZero fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
1020*10465441SEvalZero fail_unless(txpacket == 1); /* Nothing more sent */
1021*10465441SEvalZero
1022*10465441SEvalZero dhcp_offer_invalid_overload[311] = 1;
1023*10465441SEvalZero send_pkt(&net_test, dhcp_offer_invalid_overload, sizeof(dhcp_offer_invalid_overload));
1024*10465441SEvalZero /* IP addresses should be zero */
1025*10465441SEvalZero fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));
1026*10465441SEvalZero fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
1027*10465441SEvalZero fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
1028*10465441SEvalZero fail_unless(txpacket == 1); /* Nothing more sent */
1029*10465441SEvalZero
1030*10465441SEvalZero dhcp_offer_invalid_overload[311] = 0;
1031*10465441SEvalZero send_pkt(&net_test, dhcp_offer_invalid_overload, sizeof(dhcp_offer));
1032*10465441SEvalZero
1033*10465441SEvalZero fail_unless(netif_dhcp_data(&net_test)->state == DHCP_STATE_REQUESTING);
1034*10465441SEvalZero
1035*10465441SEvalZero fail_unless(txpacket == 2); /* No more sent */
1036*10465441SEvalZero xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
1037*10465441SEvalZero
1038*10465441SEvalZero tcase = TEST_NONE;
1039*10465441SEvalZero dhcp_stop(&net_test);
1040*10465441SEvalZero dhcp_cleanup(&net_test);
1041*10465441SEvalZero netif_remove(&net_test);
1042*10465441SEvalZero }
1043*10465441SEvalZero END_TEST
1044*10465441SEvalZero
1045*10465441SEvalZero /** Create the suite including all tests for this module */
1046*10465441SEvalZero Suite *
dhcp_suite(void)1047*10465441SEvalZero dhcp_suite(void)
1048*10465441SEvalZero {
1049*10465441SEvalZero testfunc tests[] = {
1050*10465441SEvalZero TESTFUNC(test_dhcp),
1051*10465441SEvalZero TESTFUNC(test_dhcp_nak),
1052*10465441SEvalZero TESTFUNC(test_dhcp_relayed),
1053*10465441SEvalZero TESTFUNC(test_dhcp_nak_no_endmarker),
1054*10465441SEvalZero TESTFUNC(test_dhcp_invalid_overload)
1055*10465441SEvalZero };
1056*10465441SEvalZero return create_suite("DHCP", tests, sizeof(tests)/sizeof(testfunc), dhcp_setup, dhcp_teardown);
1057*10465441SEvalZero }
1058