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