xref: /nrf52832-nimble/rt-thread/components/net/lwip-2.1.0/test/unit/dhcp/test_dhcp.c (revision 104654410c56c573564690304ae786df310c91fc)
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