Merge https://gitlab.denx.de/u-boot/custodians/u-boot-spi into next
[platform/kernel/u-boot.git] / net / net.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *      Copied from Linux Monitor (LiMon) - Networking.
4  *
5  *      Copyright 1994 - 2000 Neil Russell.
6  *      (See License)
7  *      Copyright 2000 Roland Borde
8  *      Copyright 2000 Paolo Scaffardi
9  *      Copyright 2000-2002 Wolfgang Denk, wd@denx.de
10  */
11
12 /*
13  * General Desription:
14  *
15  * The user interface supports commands for BOOTP, RARP, and TFTP.
16  * Also, we support ARP internally. Depending on available data,
17  * these interact as follows:
18  *
19  * BOOTP:
20  *
21  *      Prerequisites:  - own ethernet address
22  *      We want:        - own IP address
23  *                      - TFTP server IP address
24  *                      - name of bootfile
25  *      Next step:      ARP
26  *
27  * LINK_LOCAL:
28  *
29  *      Prerequisites:  - own ethernet address
30  *      We want:        - own IP address
31  *      Next step:      ARP
32  *
33  * RARP:
34  *
35  *      Prerequisites:  - own ethernet address
36  *      We want:        - own IP address
37  *                      - TFTP server IP address
38  *      Next step:      ARP
39  *
40  * ARP:
41  *
42  *      Prerequisites:  - own ethernet address
43  *                      - own IP address
44  *                      - TFTP server IP address
45  *      We want:        - TFTP server ethernet address
46  *      Next step:      TFTP
47  *
48  * DHCP:
49  *
50  *     Prerequisites:   - own ethernet address
51  *     We want:         - IP, Netmask, ServerIP, Gateway IP
52  *                      - bootfilename, lease time
53  *     Next step:       - TFTP
54  *
55  * TFTP:
56  *
57  *      Prerequisites:  - own ethernet address
58  *                      - own IP address
59  *                      - TFTP server IP address
60  *                      - TFTP server ethernet address
61  *                      - name of bootfile (if unknown, we use a default name
62  *                        derived from our own IP address)
63  *      We want:        - load the boot file
64  *      Next step:      none
65  *
66  * NFS:
67  *
68  *      Prerequisites:  - own ethernet address
69  *                      - own IP address
70  *                      - name of bootfile (if unknown, we use a default name
71  *                        derived from our own IP address)
72  *      We want:        - load the boot file
73  *      Next step:      none
74  *
75  * SNTP:
76  *
77  *      Prerequisites:  - own ethernet address
78  *                      - own IP address
79  *      We want:        - network time
80  *      Next step:      none
81  *
82  * WOL:
83  *
84  *      Prerequisites:  - own ethernet address
85  *      We want:        - magic packet or timeout
86  *      Next step:      none
87  */
88
89
90 #include <common.h>
91 #include <bootstage.h>
92 #include <command.h>
93 #include <console.h>
94 #include <env.h>
95 #include <env_internal.h>
96 #include <errno.h>
97 #include <image.h>
98 #include <log.h>
99 #include <net.h>
100 #include <net/fastboot.h>
101 #include <net/tftp.h>
102 #if defined(CONFIG_CMD_PCAP)
103 #include <net/pcap.h>
104 #endif
105 #if defined(CONFIG_LED_STATUS)
106 #include <miiphy.h>
107 #include <status_led.h>
108 #endif
109 #include <watchdog.h>
110 #include <linux/compiler.h>
111 #include "arp.h"
112 #include "bootp.h"
113 #include "cdp.h"
114 #if defined(CONFIG_CMD_DNS)
115 #include "dns.h"
116 #endif
117 #include "link_local.h"
118 #include "nfs.h"
119 #include "ping.h"
120 #include "rarp.h"
121 #if defined(CONFIG_CMD_SNTP)
122 #include "sntp.h"
123 #endif
124 #if defined(CONFIG_CMD_WOL)
125 #include "wol.h"
126 #endif
127
128 /** BOOTP EXTENTIONS **/
129
130 /* Our subnet mask (0=unknown) */
131 struct in_addr net_netmask;
132 /* Our gateways IP address */
133 struct in_addr net_gateway;
134 /* Our DNS IP address */
135 struct in_addr net_dns_server;
136 #if defined(CONFIG_BOOTP_DNS2)
137 /* Our 2nd DNS IP address */
138 struct in_addr net_dns_server2;
139 #endif
140
141 /** END OF BOOTP EXTENTIONS **/
142
143 /* Our ethernet address */
144 u8 net_ethaddr[6];
145 /* Boot server enet address */
146 u8 net_server_ethaddr[6];
147 /* Our IP addr (0 = unknown) */
148 struct in_addr  net_ip;
149 /* Server IP addr (0 = unknown) */
150 struct in_addr  net_server_ip;
151 /* Current receive packet */
152 uchar *net_rx_packet;
153 /* Current rx packet length */
154 int             net_rx_packet_len;
155 /* IP packet ID */
156 static unsigned net_ip_id;
157 /* Ethernet bcast address */
158 const u8 net_bcast_ethaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
159 const u8 net_null_ethaddr[6];
160 #if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
161 void (*push_packet)(void *, int len) = 0;
162 #endif
163 /* Network loop state */
164 enum net_loop_state net_state;
165 /* Tried all network devices */
166 int             net_restart_wrap;
167 /* Network loop restarted */
168 static int      net_restarted;
169 /* At least one device configured */
170 static int      net_dev_exists;
171
172 /* XXX in both little & big endian machines 0xFFFF == ntohs(-1) */
173 /* default is without VLAN */
174 ushort          net_our_vlan = 0xFFFF;
175 /* ditto */
176 ushort          net_native_vlan = 0xFFFF;
177
178 /* Boot File name */
179 char net_boot_file_name[1024];
180 /* Indicates whether the file name was specified on the command line */
181 bool net_boot_file_name_explicit;
182 /* The actual transferred size of the bootfile (in bytes) */
183 u32 net_boot_file_size;
184 /* Boot file size in blocks as reported by the DHCP server */
185 u32 net_boot_file_expected_size_in_blocks;
186
187 #if defined(CONFIG_CMD_SNTP)
188 /* NTP server IP address */
189 struct in_addr  net_ntp_server;
190 /* offset time from UTC */
191 int             net_ntp_time_offset;
192 #endif
193
194 static uchar net_pkt_buf[(PKTBUFSRX+1) * PKTSIZE_ALIGN + PKTALIGN];
195 /* Receive packets */
196 uchar *net_rx_packets[PKTBUFSRX];
197 /* Current UDP RX packet handler */
198 static rxhand_f *udp_packet_handler;
199 /* Current ARP RX packet handler */
200 static rxhand_f *arp_packet_handler;
201 #ifdef CONFIG_CMD_TFTPPUT
202 /* Current ICMP rx handler */
203 static rxhand_icmp_f *packet_icmp_handler;
204 #endif
205 /* Current timeout handler */
206 static thand_f *time_handler;
207 /* Time base value */
208 static ulong    time_start;
209 /* Current timeout value */
210 static ulong    time_delta;
211 /* THE transmit packet */
212 uchar *net_tx_packet;
213
214 static int net_check_prereq(enum proto_t protocol);
215
216 static int net_try_count;
217
218 int __maybe_unused net_busy_flag;
219
220 /**********************************************************************/
221
222 static int on_ipaddr(const char *name, const char *value, enum env_op op,
223         int flags)
224 {
225         if (flags & H_PROGRAMMATIC)
226                 return 0;
227
228         net_ip = string_to_ip(value);
229
230         return 0;
231 }
232 U_BOOT_ENV_CALLBACK(ipaddr, on_ipaddr);
233
234 static int on_gatewayip(const char *name, const char *value, enum env_op op,
235         int flags)
236 {
237         if (flags & H_PROGRAMMATIC)
238                 return 0;
239
240         net_gateway = string_to_ip(value);
241
242         return 0;
243 }
244 U_BOOT_ENV_CALLBACK(gatewayip, on_gatewayip);
245
246 static int on_netmask(const char *name, const char *value, enum env_op op,
247         int flags)
248 {
249         if (flags & H_PROGRAMMATIC)
250                 return 0;
251
252         net_netmask = string_to_ip(value);
253
254         return 0;
255 }
256 U_BOOT_ENV_CALLBACK(netmask, on_netmask);
257
258 static int on_serverip(const char *name, const char *value, enum env_op op,
259         int flags)
260 {
261         if (flags & H_PROGRAMMATIC)
262                 return 0;
263
264         net_server_ip = string_to_ip(value);
265
266         return 0;
267 }
268 U_BOOT_ENV_CALLBACK(serverip, on_serverip);
269
270 static int on_nvlan(const char *name, const char *value, enum env_op op,
271         int flags)
272 {
273         if (flags & H_PROGRAMMATIC)
274                 return 0;
275
276         net_native_vlan = string_to_vlan(value);
277
278         return 0;
279 }
280 U_BOOT_ENV_CALLBACK(nvlan, on_nvlan);
281
282 static int on_vlan(const char *name, const char *value, enum env_op op,
283         int flags)
284 {
285         if (flags & H_PROGRAMMATIC)
286                 return 0;
287
288         net_our_vlan = string_to_vlan(value);
289
290         return 0;
291 }
292 U_BOOT_ENV_CALLBACK(vlan, on_vlan);
293
294 #if defined(CONFIG_CMD_DNS)
295 static int on_dnsip(const char *name, const char *value, enum env_op op,
296         int flags)
297 {
298         if (flags & H_PROGRAMMATIC)
299                 return 0;
300
301         net_dns_server = string_to_ip(value);
302
303         return 0;
304 }
305 U_BOOT_ENV_CALLBACK(dnsip, on_dnsip);
306 #endif
307
308 /*
309  * Check if autoload is enabled. If so, use either NFS or TFTP to download
310  * the boot file.
311  */
312 void net_auto_load(void)
313 {
314 #if defined(CONFIG_CMD_NFS) && !defined(CONFIG_SPL_BUILD)
315         const char *s = env_get("autoload");
316
317         if (s != NULL && strcmp(s, "NFS") == 0) {
318                 if (net_check_prereq(NFS)) {
319 /* We aren't expecting to get a serverip, so just accept the assigned IP */
320 #ifdef CONFIG_BOOTP_SERVERIP
321                         net_set_state(NETLOOP_SUCCESS);
322 #else
323                         printf("Cannot autoload with NFS\n");
324                         net_set_state(NETLOOP_FAIL);
325 #endif
326                         return;
327                 }
328                 /*
329                  * Use NFS to load the bootfile.
330                  */
331                 nfs_start();
332                 return;
333         }
334 #endif
335         if (env_get_yesno("autoload") == 0) {
336                 /*
337                  * Just use BOOTP/RARP to configure system;
338                  * Do not use TFTP to load the bootfile.
339                  */
340                 net_set_state(NETLOOP_SUCCESS);
341                 return;
342         }
343         if (net_check_prereq(TFTPGET)) {
344 /* We aren't expecting to get a serverip, so just accept the assigned IP */
345 #ifdef CONFIG_BOOTP_SERVERIP
346                 net_set_state(NETLOOP_SUCCESS);
347 #else
348                 printf("Cannot autoload with TFTPGET\n");
349                 net_set_state(NETLOOP_FAIL);
350 #endif
351                 return;
352         }
353         tftp_start(TFTPGET);
354 }
355
356 static void net_init_loop(void)
357 {
358         if (eth_get_dev())
359                 memcpy(net_ethaddr, eth_get_ethaddr(), 6);
360
361         return;
362 }
363
364 static void net_clear_handlers(void)
365 {
366         net_set_udp_handler(NULL);
367         net_set_arp_handler(NULL);
368         net_set_timeout_handler(0, NULL);
369 }
370
371 static void net_cleanup_loop(void)
372 {
373         net_clear_handlers();
374 }
375
376 void net_init(void)
377 {
378         static int first_call = 1;
379
380         if (first_call) {
381                 /*
382                  *      Setup packet buffers, aligned correctly.
383                  */
384                 int i;
385
386                 net_tx_packet = &net_pkt_buf[0] + (PKTALIGN - 1);
387                 net_tx_packet -= (ulong)net_tx_packet % PKTALIGN;
388                 for (i = 0; i < PKTBUFSRX; i++) {
389                         net_rx_packets[i] = net_tx_packet +
390                                 (i + 1) * PKTSIZE_ALIGN;
391                 }
392                 arp_init();
393                 net_clear_handlers();
394
395                 /* Only need to setup buffer pointers once. */
396                 first_call = 0;
397         }
398
399         net_init_loop();
400 }
401
402 /**********************************************************************/
403 /*
404  *      Main network processing loop.
405  */
406
407 int net_loop(enum proto_t protocol)
408 {
409         int ret = -EINVAL;
410         enum net_loop_state prev_net_state = net_state;
411
412         net_restarted = 0;
413         net_dev_exists = 0;
414         net_try_count = 1;
415         debug_cond(DEBUG_INT_STATE, "--- net_loop Entry\n");
416
417         bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start");
418         net_init();
419         if (eth_is_on_demand_init() || protocol != NETCONS) {
420                 eth_halt();
421                 eth_set_current();
422                 ret = eth_init();
423                 if (ret < 0) {
424                         eth_halt();
425                         return ret;
426                 }
427         } else {
428                 eth_init_state_only();
429         }
430 restart:
431 #ifdef CONFIG_USB_KEYBOARD
432         net_busy_flag = 0;
433 #endif
434         net_set_state(NETLOOP_CONTINUE);
435
436         /*
437          *      Start the ball rolling with the given start function.  From
438          *      here on, this code is a state machine driven by received
439          *      packets and timer events.
440          */
441         debug_cond(DEBUG_INT_STATE, "--- net_loop Init\n");
442         net_init_loop();
443
444         switch (net_check_prereq(protocol)) {
445         case 1:
446                 /* network not configured */
447                 eth_halt();
448                 net_set_state(prev_net_state);
449                 return -ENODEV;
450
451         case 2:
452                 /* network device not configured */
453                 break;
454
455         case 0:
456                 net_dev_exists = 1;
457                 net_boot_file_size = 0;
458                 switch (protocol) {
459 #ifdef CONFIG_CMD_TFTPBOOT
460                 case TFTPGET:
461 #ifdef CONFIG_CMD_TFTPPUT
462                 case TFTPPUT:
463 #endif
464                         /* always use ARP to get server ethernet address */
465                         tftp_start(protocol);
466                         break;
467 #endif
468 #ifdef CONFIG_CMD_TFTPSRV
469                 case TFTPSRV:
470                         tftp_start_server();
471                         break;
472 #endif
473 #ifdef CONFIG_UDP_FUNCTION_FASTBOOT
474                 case FASTBOOT:
475                         fastboot_start_server();
476                         break;
477 #endif
478 #if defined(CONFIG_CMD_DHCP)
479                 case DHCP:
480                         bootp_reset();
481                         net_ip.s_addr = 0;
482                         dhcp_request();         /* Basically same as BOOTP */
483                         break;
484 #endif
485 #if defined(CONFIG_CMD_BOOTP)
486                 case BOOTP:
487                         bootp_reset();
488                         net_ip.s_addr = 0;
489                         bootp_request();
490                         break;
491 #endif
492 #if defined(CONFIG_CMD_RARP)
493                 case RARP:
494                         rarp_try = 0;
495                         net_ip.s_addr = 0;
496                         rarp_request();
497                         break;
498 #endif
499 #if defined(CONFIG_CMD_PING)
500                 case PING:
501                         ping_start();
502                         break;
503 #endif
504 #if defined(CONFIG_CMD_NFS) && !defined(CONFIG_SPL_BUILD)
505                 case NFS:
506                         nfs_start();
507                         break;
508 #endif
509 #if defined(CONFIG_CMD_CDP)
510                 case CDP:
511                         cdp_start();
512                         break;
513 #endif
514 #if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
515                 case NETCONS:
516                         nc_start();
517                         break;
518 #endif
519 #if defined(CONFIG_CMD_SNTP)
520                 case SNTP:
521                         sntp_start();
522                         break;
523 #endif
524 #if defined(CONFIG_CMD_DNS)
525                 case DNS:
526                         dns_start();
527                         break;
528 #endif
529 #if defined(CONFIG_CMD_LINK_LOCAL)
530                 case LINKLOCAL:
531                         link_local_start();
532                         break;
533 #endif
534 #if defined(CONFIG_CMD_WOL)
535                 case WOL:
536                         wol_start();
537                         break;
538 #endif
539                 default:
540                         break;
541                 }
542
543                 break;
544         }
545
546 #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
547 #if     defined(CONFIG_SYS_FAULT_ECHO_LINK_DOWN)        && \
548         defined(CONFIG_LED_STATUS)                      && \
549         defined(CONFIG_LED_STATUS_RED)
550         /*
551          * Echo the inverted link state to the fault LED.
552          */
553         if (miiphy_link(eth_get_dev()->name, CONFIG_SYS_FAULT_MII_ADDR))
554                 status_led_set(CONFIG_LED_STATUS_RED, CONFIG_LED_STATUS_OFF);
555         else
556                 status_led_set(CONFIG_LED_STATUS_RED, CONFIG_LED_STATUS_ON);
557 #endif /* CONFIG_SYS_FAULT_ECHO_LINK_DOWN, ... */
558 #endif /* CONFIG_MII, ... */
559 #ifdef CONFIG_USB_KEYBOARD
560         net_busy_flag = 1;
561 #endif
562
563         /*
564          *      Main packet reception loop.  Loop receiving packets until
565          *      someone sets `net_state' to a state that terminates.
566          */
567         for (;;) {
568                 WATCHDOG_RESET();
569                 if (arp_timeout_check() > 0)
570                         time_start = get_timer(0);
571
572                 /*
573                  *      Check the ethernet for a new packet.  The ethernet
574                  *      receive routine will process it.
575                  *      Most drivers return the most recent packet size, but not
576                  *      errors that may have happened.
577                  */
578                 eth_rx();
579
580                 /*
581                  *      Abort if ctrl-c was pressed.
582                  */
583                 if (ctrlc()) {
584                         /* cancel any ARP that may not have completed */
585                         net_arp_wait_packet_ip.s_addr = 0;
586
587                         net_cleanup_loop();
588                         eth_halt();
589                         /* Invalidate the last protocol */
590                         eth_set_last_protocol(BOOTP);
591
592                         puts("\nAbort\n");
593                         /* include a debug print as well incase the debug
594                            messages are directed to stderr */
595                         debug_cond(DEBUG_INT_STATE, "--- net_loop Abort!\n");
596                         ret = -EINTR;
597                         goto done;
598                 }
599
600                 /*
601                  *      Check for a timeout, and run the timeout handler
602                  *      if we have one.
603                  */
604                 if (time_handler &&
605                     ((get_timer(0) - time_start) > time_delta)) {
606                         thand_f *x;
607
608 #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
609 #if     defined(CONFIG_SYS_FAULT_ECHO_LINK_DOWN)        && \
610         defined(CONFIG_LED_STATUS)                      && \
611         defined(CONFIG_LED_STATUS_RED)
612                         /*
613                          * Echo the inverted link state to the fault LED.
614                          */
615                         if (miiphy_link(eth_get_dev()->name,
616                                         CONFIG_SYS_FAULT_MII_ADDR))
617                                 status_led_set(CONFIG_LED_STATUS_RED,
618                                                CONFIG_LED_STATUS_OFF);
619                         else
620                                 status_led_set(CONFIG_LED_STATUS_RED,
621                                                CONFIG_LED_STATUS_ON);
622 #endif /* CONFIG_SYS_FAULT_ECHO_LINK_DOWN, ... */
623 #endif /* CONFIG_MII, ... */
624                         debug_cond(DEBUG_INT_STATE, "--- net_loop timeout\n");
625                         x = time_handler;
626                         time_handler = (thand_f *)0;
627                         (*x)();
628                 }
629
630                 if (net_state == NETLOOP_FAIL)
631                         ret = net_start_again();
632
633                 switch (net_state) {
634                 case NETLOOP_RESTART:
635                         net_restarted = 1;
636                         goto restart;
637
638                 case NETLOOP_SUCCESS:
639                         net_cleanup_loop();
640                         if (net_boot_file_size > 0) {
641                                 printf("Bytes transferred = %d (%x hex)\n",
642                                        net_boot_file_size, net_boot_file_size);
643                                 env_set_hex("filesize", net_boot_file_size);
644                                 env_set_hex("fileaddr", image_load_addr);
645                         }
646                         if (protocol != NETCONS)
647                                 eth_halt();
648                         else
649                                 eth_halt_state_only();
650
651                         eth_set_last_protocol(protocol);
652
653                         ret = net_boot_file_size;
654                         debug_cond(DEBUG_INT_STATE, "--- net_loop Success!\n");
655                         goto done;
656
657                 case NETLOOP_FAIL:
658                         net_cleanup_loop();
659                         /* Invalidate the last protocol */
660                         eth_set_last_protocol(BOOTP);
661                         debug_cond(DEBUG_INT_STATE, "--- net_loop Fail!\n");
662                         ret = -ENONET;
663                         goto done;
664
665                 case NETLOOP_CONTINUE:
666                         continue;
667                 }
668         }
669
670 done:
671 #ifdef CONFIG_USB_KEYBOARD
672         net_busy_flag = 0;
673 #endif
674 #ifdef CONFIG_CMD_TFTPPUT
675         /* Clear out the handlers */
676         net_set_udp_handler(NULL);
677         net_set_icmp_handler(NULL);
678 #endif
679         net_set_state(prev_net_state);
680
681 #if defined(CONFIG_CMD_PCAP)
682         if (pcap_active())
683                 pcap_print_status();
684 #endif
685         return ret;
686 }
687
688 /**********************************************************************/
689
690 static void start_again_timeout_handler(void)
691 {
692         net_set_state(NETLOOP_RESTART);
693 }
694
695 int net_start_again(void)
696 {
697         char *nretry;
698         int retry_forever = 0;
699         unsigned long retrycnt = 0;
700         int ret;
701
702         nretry = env_get("netretry");
703         if (nretry) {
704                 if (!strcmp(nretry, "yes"))
705                         retry_forever = 1;
706                 else if (!strcmp(nretry, "no"))
707                         retrycnt = 0;
708                 else if (!strcmp(nretry, "once"))
709                         retrycnt = 1;
710                 else
711                         retrycnt = simple_strtoul(nretry, NULL, 0);
712         } else {
713                 retrycnt = 0;
714                 retry_forever = 0;
715         }
716
717         if ((!retry_forever) && (net_try_count > retrycnt)) {
718                 eth_halt();
719                 net_set_state(NETLOOP_FAIL);
720                 /*
721                  * We don't provide a way for the protocol to return an error,
722                  * but this is almost always the reason.
723                  */
724                 return -ETIMEDOUT;
725         }
726
727         net_try_count++;
728
729         eth_halt();
730 #if !defined(CONFIG_NET_DO_NOT_TRY_ANOTHER)
731         eth_try_another(!net_restarted);
732 #endif
733         ret = eth_init();
734         if (net_restart_wrap) {
735                 net_restart_wrap = 0;
736                 if (net_dev_exists) {
737                         net_set_timeout_handler(10000UL,
738                                                 start_again_timeout_handler);
739                         net_set_udp_handler(NULL);
740                 } else {
741                         net_set_state(NETLOOP_FAIL);
742                 }
743         } else {
744                 net_set_state(NETLOOP_RESTART);
745         }
746         return ret;
747 }
748
749 /**********************************************************************/
750 /*
751  *      Miscelaneous bits.
752  */
753
754 static void dummy_handler(uchar *pkt, unsigned dport,
755                         struct in_addr sip, unsigned sport,
756                         unsigned len)
757 {
758 }
759
760 rxhand_f *net_get_udp_handler(void)
761 {
762         return udp_packet_handler;
763 }
764
765 void net_set_udp_handler(rxhand_f *f)
766 {
767         debug_cond(DEBUG_INT_STATE, "--- net_loop UDP handler set (%p)\n", f);
768         if (f == NULL)
769                 udp_packet_handler = dummy_handler;
770         else
771                 udp_packet_handler = f;
772 }
773
774 rxhand_f *net_get_arp_handler(void)
775 {
776         return arp_packet_handler;
777 }
778
779 void net_set_arp_handler(rxhand_f *f)
780 {
781         debug_cond(DEBUG_INT_STATE, "--- net_loop ARP handler set (%p)\n", f);
782         if (f == NULL)
783                 arp_packet_handler = dummy_handler;
784         else
785                 arp_packet_handler = f;
786 }
787
788 #ifdef CONFIG_CMD_TFTPPUT
789 void net_set_icmp_handler(rxhand_icmp_f *f)
790 {
791         packet_icmp_handler = f;
792 }
793 #endif
794
795 void net_set_timeout_handler(ulong iv, thand_f *f)
796 {
797         if (iv == 0) {
798                 debug_cond(DEBUG_INT_STATE,
799                            "--- net_loop timeout handler cancelled\n");
800                 time_handler = (thand_f *)0;
801         } else {
802                 debug_cond(DEBUG_INT_STATE,
803                            "--- net_loop timeout handler set (%p)\n", f);
804                 time_handler = f;
805                 time_start = get_timer(0);
806                 time_delta = iv * CONFIG_SYS_HZ / 1000;
807         }
808 }
809
810 uchar *net_get_async_tx_pkt_buf(void)
811 {
812         if (arp_is_waiting())
813                 return arp_tx_packet; /* If we are waiting, we already sent */
814         else
815                 return net_tx_packet;
816 }
817
818 int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport, int sport,
819                 int payload_len)
820 {
821         return net_send_ip_packet(ether, dest, dport, sport, payload_len,
822                                   IPPROTO_UDP, 0, 0, 0);
823 }
824
825 int net_send_ip_packet(uchar *ether, struct in_addr dest, int dport, int sport,
826                        int payload_len, int proto, u8 action, u32 tcp_seq_num,
827                        u32 tcp_ack_num)
828 {
829         uchar *pkt;
830         int eth_hdr_size;
831         int pkt_hdr_size;
832
833         /* make sure the net_tx_packet is initialized (net_init() was called) */
834         assert(net_tx_packet != NULL);
835         if (net_tx_packet == NULL)
836                 return -1;
837
838         /* convert to new style broadcast */
839         if (dest.s_addr == 0)
840                 dest.s_addr = 0xFFFFFFFF;
841
842         /* if broadcast, make the ether address a broadcast and don't do ARP */
843         if (dest.s_addr == 0xFFFFFFFF)
844                 ether = (uchar *)net_bcast_ethaddr;
845
846         pkt = (uchar *)net_tx_packet;
847
848         eth_hdr_size = net_set_ether(pkt, ether, PROT_IP);
849
850         switch (proto) {
851         case IPPROTO_UDP:
852                 net_set_udp_header(pkt + eth_hdr_size, dest, dport, sport,
853                                    payload_len);
854                 pkt_hdr_size = eth_hdr_size + IP_UDP_HDR_SIZE;
855                 break;
856         default:
857                 return -EINVAL;
858         }
859
860         /* if MAC address was not discovered yet, do an ARP request */
861         if (memcmp(ether, net_null_ethaddr, 6) == 0) {
862                 debug_cond(DEBUG_DEV_PKT, "sending ARP for %pI4\n", &dest);
863
864                 /* save the ip and eth addr for the packet to send after arp */
865                 net_arp_wait_packet_ip = dest;
866                 arp_wait_packet_ethaddr = ether;
867
868                 /* size of the waiting packet */
869                 arp_wait_tx_packet_size = pkt_hdr_size + payload_len;
870
871                 /* and do the ARP request */
872                 arp_wait_try = 1;
873                 arp_wait_timer_start = get_timer(0);
874                 arp_request();
875                 return 1;       /* waiting */
876         } else {
877                 debug_cond(DEBUG_DEV_PKT, "sending UDP to %pI4/%pM\n",
878                            &dest, ether);
879                 net_send_packet(net_tx_packet, pkt_hdr_size + payload_len);
880                 return 0;       /* transmitted */
881         }
882 }
883
884 #ifdef CONFIG_IP_DEFRAG
885 /*
886  * This function collects fragments in a single packet, according
887  * to the algorithm in RFC815. It returns NULL or the pointer to
888  * a complete packet, in static storage
889  */
890 #define IP_PKTSIZE (CONFIG_NET_MAXDEFRAG)
891
892 #define IP_MAXUDP (IP_PKTSIZE - IP_HDR_SIZE)
893
894 /*
895  * this is the packet being assembled, either data or frag control.
896  * Fragments go by 8 bytes, so this union must be 8 bytes long
897  */
898 struct hole {
899         /* first_byte is address of this structure */
900         u16 last_byte;  /* last byte in this hole + 1 (begin of next hole) */
901         u16 next_hole;  /* index of next (in 8-b blocks), 0 == none */
902         u16 prev_hole;  /* index of prev, 0 == none */
903         u16 unused;
904 };
905
906 static struct ip_udp_hdr *__net_defragment(struct ip_udp_hdr *ip, int *lenp)
907 {
908         static uchar pkt_buff[IP_PKTSIZE] __aligned(PKTALIGN);
909         static u16 first_hole, total_len;
910         struct hole *payload, *thisfrag, *h, *newh;
911         struct ip_udp_hdr *localip = (struct ip_udp_hdr *)pkt_buff;
912         uchar *indata = (uchar *)ip;
913         int offset8, start, len, done = 0;
914         u16 ip_off = ntohs(ip->ip_off);
915
916         /* payload starts after IP header, this fragment is in there */
917         payload = (struct hole *)(pkt_buff + IP_HDR_SIZE);
918         offset8 =  (ip_off & IP_OFFS);
919         thisfrag = payload + offset8;
920         start = offset8 * 8;
921         len = ntohs(ip->ip_len) - IP_HDR_SIZE;
922
923         if (start + len > IP_MAXUDP) /* fragment extends too far */
924                 return NULL;
925
926         if (!total_len || localip->ip_id != ip->ip_id) {
927                 /* new (or different) packet, reset structs */
928                 total_len = 0xffff;
929                 payload[0].last_byte = ~0;
930                 payload[0].next_hole = 0;
931                 payload[0].prev_hole = 0;
932                 first_hole = 0;
933                 /* any IP header will work, copy the first we received */
934                 memcpy(localip, ip, IP_HDR_SIZE);
935         }
936
937         /*
938          * What follows is the reassembly algorithm. We use the payload
939          * array as a linked list of hole descriptors, as each hole starts
940          * at a multiple of 8 bytes. However, last byte can be whatever value,
941          * so it is represented as byte count, not as 8-byte blocks.
942          */
943
944         h = payload + first_hole;
945         while (h->last_byte < start) {
946                 if (!h->next_hole) {
947                         /* no hole that far away */
948                         return NULL;
949                 }
950                 h = payload + h->next_hole;
951         }
952
953         /* last fragment may be 1..7 bytes, the "+7" forces acceptance */
954         if (offset8 + ((len + 7) / 8) <= h - payload) {
955                 /* no overlap with holes (dup fragment?) */
956                 return NULL;
957         }
958
959         if (!(ip_off & IP_FLAGS_MFRAG)) {
960                 /* no more fragmentss: truncate this (last) hole */
961                 total_len = start + len;
962                 h->last_byte = start + len;
963         }
964
965         /*
966          * There is some overlap: fix the hole list. This code doesn't
967          * deal with a fragment that overlaps with two different holes
968          * (thus being a superset of a previously-received fragment).
969          */
970
971         if ((h >= thisfrag) && (h->last_byte <= start + len)) {
972                 /* complete overlap with hole: remove hole */
973                 if (!h->prev_hole && !h->next_hole) {
974                         /* last remaining hole */
975                         done = 1;
976                 } else if (!h->prev_hole) {
977                         /* first hole */
978                         first_hole = h->next_hole;
979                         payload[h->next_hole].prev_hole = 0;
980                 } else if (!h->next_hole) {
981                         /* last hole */
982                         payload[h->prev_hole].next_hole = 0;
983                 } else {
984                         /* in the middle of the list */
985                         payload[h->next_hole].prev_hole = h->prev_hole;
986                         payload[h->prev_hole].next_hole = h->next_hole;
987                 }
988
989         } else if (h->last_byte <= start + len) {
990                 /* overlaps with final part of the hole: shorten this hole */
991                 h->last_byte = start;
992
993         } else if (h >= thisfrag) {
994                 /* overlaps with initial part of the hole: move this hole */
995                 newh = thisfrag + (len / 8);
996                 *newh = *h;
997                 h = newh;
998                 if (h->next_hole)
999                         payload[h->next_hole].prev_hole = (h - payload);
1000                 if (h->prev_hole)
1001                         payload[h->prev_hole].next_hole = (h - payload);
1002                 else
1003                         first_hole = (h - payload);
1004
1005         } else {
1006                 /* fragment sits in the middle: split the hole */
1007                 newh = thisfrag + (len / 8);
1008                 *newh = *h;
1009                 h->last_byte = start;
1010                 h->next_hole = (newh - payload);
1011                 newh->prev_hole = (h - payload);
1012                 if (newh->next_hole)
1013                         payload[newh->next_hole].prev_hole = (newh - payload);
1014         }
1015
1016         /* finally copy this fragment and possibly return whole packet */
1017         memcpy((uchar *)thisfrag, indata + IP_HDR_SIZE, len);
1018         if (!done)
1019                 return NULL;
1020
1021         localip->ip_len = htons(total_len);
1022         *lenp = total_len + IP_HDR_SIZE;
1023         return localip;
1024 }
1025
1026 static inline struct ip_udp_hdr *net_defragment(struct ip_udp_hdr *ip,
1027         int *lenp)
1028 {
1029         u16 ip_off = ntohs(ip->ip_off);
1030         if (!(ip_off & (IP_OFFS | IP_FLAGS_MFRAG)))
1031                 return ip; /* not a fragment */
1032         return __net_defragment(ip, lenp);
1033 }
1034
1035 #else /* !CONFIG_IP_DEFRAG */
1036
1037 static inline struct ip_udp_hdr *net_defragment(struct ip_udp_hdr *ip,
1038         int *lenp)
1039 {
1040         u16 ip_off = ntohs(ip->ip_off);
1041         if (!(ip_off & (IP_OFFS | IP_FLAGS_MFRAG)))
1042                 return ip; /* not a fragment */
1043         return NULL;
1044 }
1045 #endif
1046
1047 /**
1048  * Receive an ICMP packet. We deal with REDIRECT and PING here, and silently
1049  * drop others.
1050  *
1051  * @parma ip    IP packet containing the ICMP
1052  */
1053 static void receive_icmp(struct ip_udp_hdr *ip, int len,
1054                         struct in_addr src_ip, struct ethernet_hdr *et)
1055 {
1056         struct icmp_hdr *icmph = (struct icmp_hdr *)&ip->udp_src;
1057
1058         switch (icmph->type) {
1059         case ICMP_REDIRECT:
1060                 if (icmph->code != ICMP_REDIR_HOST)
1061                         return;
1062                 printf(" ICMP Host Redirect to %pI4 ",
1063                        &icmph->un.gateway);
1064                 break;
1065         default:
1066 #if defined(CONFIG_CMD_PING)
1067                 ping_receive(et, ip, len);
1068 #endif
1069 #ifdef CONFIG_CMD_TFTPPUT
1070                 if (packet_icmp_handler)
1071                         packet_icmp_handler(icmph->type, icmph->code,
1072                                             ntohs(ip->udp_dst), src_ip,
1073                                             ntohs(ip->udp_src), icmph->un.data,
1074                                             ntohs(ip->udp_len));
1075 #endif
1076                 break;
1077         }
1078 }
1079
1080 void net_process_received_packet(uchar *in_packet, int len)
1081 {
1082         struct ethernet_hdr *et;
1083         struct ip_udp_hdr *ip;
1084         struct in_addr dst_ip;
1085         struct in_addr src_ip;
1086         int eth_proto;
1087 #if defined(CONFIG_CMD_CDP)
1088         int iscdp;
1089 #endif
1090         ushort cti = 0, vlanid = VLAN_NONE, myvlanid, mynvlanid;
1091
1092         debug_cond(DEBUG_NET_PKT, "packet received\n");
1093
1094 #if defined(CONFIG_CMD_PCAP)
1095         pcap_post(in_packet, len, false);
1096 #endif
1097         net_rx_packet = in_packet;
1098         net_rx_packet_len = len;
1099         et = (struct ethernet_hdr *)in_packet;
1100
1101         /* too small packet? */
1102         if (len < ETHER_HDR_SIZE)
1103                 return;
1104
1105 #if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
1106         if (push_packet) {
1107                 (*push_packet)(in_packet, len);
1108                 return;
1109         }
1110 #endif
1111
1112 #if defined(CONFIG_CMD_CDP)
1113         /* keep track if packet is CDP */
1114         iscdp = is_cdp_packet(et->et_dest);
1115 #endif
1116
1117         myvlanid = ntohs(net_our_vlan);
1118         if (myvlanid == (ushort)-1)
1119                 myvlanid = VLAN_NONE;
1120         mynvlanid = ntohs(net_native_vlan);
1121         if (mynvlanid == (ushort)-1)
1122                 mynvlanid = VLAN_NONE;
1123
1124         eth_proto = ntohs(et->et_protlen);
1125
1126         if (eth_proto < 1514) {
1127                 struct e802_hdr *et802 = (struct e802_hdr *)et;
1128                 /*
1129                  *      Got a 802.2 packet.  Check the other protocol field.
1130                  *      XXX VLAN over 802.2+SNAP not implemented!
1131                  */
1132                 eth_proto = ntohs(et802->et_prot);
1133
1134                 ip = (struct ip_udp_hdr *)(in_packet + E802_HDR_SIZE);
1135                 len -= E802_HDR_SIZE;
1136
1137         } else if (eth_proto != PROT_VLAN) {    /* normal packet */
1138                 ip = (struct ip_udp_hdr *)(in_packet + ETHER_HDR_SIZE);
1139                 len -= ETHER_HDR_SIZE;
1140
1141         } else {                        /* VLAN packet */
1142                 struct vlan_ethernet_hdr *vet =
1143                         (struct vlan_ethernet_hdr *)et;
1144
1145                 debug_cond(DEBUG_NET_PKT, "VLAN packet received\n");
1146
1147                 /* too small packet? */
1148                 if (len < VLAN_ETHER_HDR_SIZE)
1149                         return;
1150
1151                 /* if no VLAN active */
1152                 if ((ntohs(net_our_vlan) & VLAN_IDMASK) == VLAN_NONE
1153 #if defined(CONFIG_CMD_CDP)
1154                                 && iscdp == 0
1155 #endif
1156                                 )
1157                         return;
1158
1159                 cti = ntohs(vet->vet_tag);
1160                 vlanid = cti & VLAN_IDMASK;
1161                 eth_proto = ntohs(vet->vet_type);
1162
1163                 ip = (struct ip_udp_hdr *)(in_packet + VLAN_ETHER_HDR_SIZE);
1164                 len -= VLAN_ETHER_HDR_SIZE;
1165         }
1166
1167         debug_cond(DEBUG_NET_PKT, "Receive from protocol 0x%x\n", eth_proto);
1168
1169 #if defined(CONFIG_CMD_CDP)
1170         if (iscdp) {
1171                 cdp_receive((uchar *)ip, len);
1172                 return;
1173         }
1174 #endif
1175
1176         if ((myvlanid & VLAN_IDMASK) != VLAN_NONE) {
1177                 if (vlanid == VLAN_NONE)
1178                         vlanid = (mynvlanid & VLAN_IDMASK);
1179                 /* not matched? */
1180                 if (vlanid != (myvlanid & VLAN_IDMASK))
1181                         return;
1182         }
1183
1184         switch (eth_proto) {
1185         case PROT_ARP:
1186                 arp_receive(et, ip, len);
1187                 break;
1188
1189 #ifdef CONFIG_CMD_RARP
1190         case PROT_RARP:
1191                 rarp_receive(ip, len);
1192                 break;
1193 #endif
1194         case PROT_IP:
1195                 debug_cond(DEBUG_NET_PKT, "Got IP\n");
1196                 /* Before we start poking the header, make sure it is there */
1197                 if (len < IP_UDP_HDR_SIZE) {
1198                         debug("len bad %d < %lu\n", len,
1199                               (ulong)IP_UDP_HDR_SIZE);
1200                         return;
1201                 }
1202                 /* Check the packet length */
1203                 if (len < ntohs(ip->ip_len)) {
1204                         debug("len bad %d < %d\n", len, ntohs(ip->ip_len));
1205                         return;
1206                 }
1207                 len = ntohs(ip->ip_len);
1208                 debug_cond(DEBUG_NET_PKT, "len=%d, v=%02x\n",
1209                            len, ip->ip_hl_v & 0xff);
1210
1211                 /* Can't deal with anything except IPv4 */
1212                 if ((ip->ip_hl_v & 0xf0) != 0x40)
1213                         return;
1214                 /* Can't deal with IP options (headers != 20 bytes) */
1215                 if ((ip->ip_hl_v & 0x0f) > 0x05)
1216                         return;
1217                 /* Check the Checksum of the header */
1218                 if (!ip_checksum_ok((uchar *)ip, IP_HDR_SIZE)) {
1219                         debug("checksum bad\n");
1220                         return;
1221                 }
1222                 /* If it is not for us, ignore it */
1223                 dst_ip = net_read_ip(&ip->ip_dst);
1224                 if (net_ip.s_addr && dst_ip.s_addr != net_ip.s_addr &&
1225                     dst_ip.s_addr != 0xFFFFFFFF) {
1226                                 return;
1227                 }
1228                 /* Read source IP address for later use */
1229                 src_ip = net_read_ip(&ip->ip_src);
1230                 /*
1231                  * The function returns the unchanged packet if it's not
1232                  * a fragment, and either the complete packet or NULL if
1233                  * it is a fragment (if !CONFIG_IP_DEFRAG, it returns NULL)
1234                  */
1235                 ip = net_defragment(ip, &len);
1236                 if (!ip)
1237                         return;
1238                 /*
1239                  * watch for ICMP host redirects
1240                  *
1241                  * There is no real handler code (yet). We just watch
1242                  * for ICMP host redirect messages. In case anybody
1243                  * sees these messages: please contact me
1244                  * (wd@denx.de), or - even better - send me the
1245                  * necessary fixes :-)
1246                  *
1247                  * Note: in all cases where I have seen this so far
1248                  * it was a problem with the router configuration,
1249                  * for instance when a router was configured in the
1250                  * BOOTP reply, but the TFTP server was on the same
1251                  * subnet. So this is probably a warning that your
1252                  * configuration might be wrong. But I'm not really
1253                  * sure if there aren't any other situations.
1254                  *
1255                  * Simon Glass <sjg@chromium.org>: We get an ICMP when
1256                  * we send a tftp packet to a dead connection, or when
1257                  * there is no server at the other end.
1258                  */
1259                 if (ip->ip_p == IPPROTO_ICMP) {
1260                         receive_icmp(ip, len, src_ip, et);
1261                         return;
1262                 } else if (ip->ip_p != IPPROTO_UDP) {   /* Only UDP packets */
1263                         return;
1264                 }
1265
1266                 if (ntohs(ip->udp_len) < UDP_HDR_SIZE || ntohs(ip->udp_len) > ntohs(ip->ip_len))
1267                         return;
1268
1269                 debug_cond(DEBUG_DEV_PKT,
1270                            "received UDP (to=%pI4, from=%pI4, len=%d)\n",
1271                            &dst_ip, &src_ip, len);
1272
1273 #ifdef CONFIG_UDP_CHECKSUM
1274                 if (ip->udp_xsum != 0) {
1275                         ulong   xsum;
1276                         u8 *sumptr;
1277                         ushort  sumlen;
1278
1279                         xsum  = ip->ip_p;
1280                         xsum += (ntohs(ip->udp_len));
1281                         xsum += (ntohl(ip->ip_src.s_addr) >> 16) & 0x0000ffff;
1282                         xsum += (ntohl(ip->ip_src.s_addr) >>  0) & 0x0000ffff;
1283                         xsum += (ntohl(ip->ip_dst.s_addr) >> 16) & 0x0000ffff;
1284                         xsum += (ntohl(ip->ip_dst.s_addr) >>  0) & 0x0000ffff;
1285
1286                         sumlen = ntohs(ip->udp_len);
1287                         sumptr = (u8 *)&ip->udp_src;
1288
1289                         while (sumlen > 1) {
1290                                 /* inlined ntohs() to avoid alignment errors */
1291                                 xsum += (sumptr[0] << 8) + sumptr[1];
1292                                 sumptr += 2;
1293                                 sumlen -= 2;
1294                         }
1295                         if (sumlen > 0)
1296                                 xsum += (sumptr[0] << 8) + sumptr[0];
1297                         while ((xsum >> 16) != 0) {
1298                                 xsum = (xsum & 0x0000ffff) +
1299                                        ((xsum >> 16) & 0x0000ffff);
1300                         }
1301                         if ((xsum != 0x00000000) && (xsum != 0x0000ffff)) {
1302                                 printf(" UDP wrong checksum %08lx %08x\n",
1303                                        xsum, ntohs(ip->udp_xsum));
1304                                 return;
1305                         }
1306                 }
1307 #endif
1308
1309 #if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
1310                 nc_input_packet((uchar *)ip + IP_UDP_HDR_SIZE,
1311                                 src_ip,
1312                                 ntohs(ip->udp_dst),
1313                                 ntohs(ip->udp_src),
1314                                 ntohs(ip->udp_len) - UDP_HDR_SIZE);
1315 #endif
1316                 /*
1317                  * IP header OK.  Pass the packet to the current handler.
1318                  */
1319                 (*udp_packet_handler)((uchar *)ip + IP_UDP_HDR_SIZE,
1320                                       ntohs(ip->udp_dst),
1321                                       src_ip,
1322                                       ntohs(ip->udp_src),
1323                                       ntohs(ip->udp_len) - UDP_HDR_SIZE);
1324                 break;
1325 #ifdef CONFIG_CMD_WOL
1326         case PROT_WOL:
1327                 wol_receive(ip, len);
1328                 break;
1329 #endif
1330         }
1331 }
1332
1333 /**********************************************************************/
1334
1335 static int net_check_prereq(enum proto_t protocol)
1336 {
1337         switch (protocol) {
1338                 /* Fall through */
1339 #if defined(CONFIG_CMD_PING)
1340         case PING:
1341                 if (net_ping_ip.s_addr == 0) {
1342                         puts("*** ERROR: ping address not given\n");
1343                         return 1;
1344                 }
1345                 goto common;
1346 #endif
1347 #if defined(CONFIG_CMD_SNTP)
1348         case SNTP:
1349                 if (net_ntp_server.s_addr == 0) {
1350                         puts("*** ERROR: NTP server address not given\n");
1351                         return 1;
1352                 }
1353                 goto common;
1354 #endif
1355 #if defined(CONFIG_CMD_DNS)
1356         case DNS:
1357                 if (net_dns_server.s_addr == 0) {
1358                         puts("*** ERROR: DNS server address not given\n");
1359                         return 1;
1360                 }
1361                 goto common;
1362 #endif
1363 #if defined(CONFIG_CMD_NFS)
1364         case NFS:
1365 #endif
1366                 /* Fall through */
1367         case TFTPGET:
1368         case TFTPPUT:
1369                 if (net_server_ip.s_addr == 0 && !is_serverip_in_cmd()) {
1370                         puts("*** ERROR: `serverip' not set\n");
1371                         return 1;
1372                 }
1373 #if     defined(CONFIG_CMD_PING) || defined(CONFIG_CMD_SNTP) || \
1374         defined(CONFIG_CMD_DNS)
1375 common:
1376 #endif
1377                 /* Fall through */
1378
1379         case NETCONS:
1380         case FASTBOOT:
1381         case TFTPSRV:
1382                 if (net_ip.s_addr == 0) {
1383                         puts("*** ERROR: `ipaddr' not set\n");
1384                         return 1;
1385                 }
1386                 /* Fall through */
1387
1388 #ifdef CONFIG_CMD_RARP
1389         case RARP:
1390 #endif
1391         case BOOTP:
1392         case CDP:
1393         case DHCP:
1394         case LINKLOCAL:
1395                 if (memcmp(net_ethaddr, "\0\0\0\0\0\0", 6) == 0) {
1396                         int num = eth_get_dev_index();
1397
1398                         switch (num) {
1399                         case -1:
1400                                 puts("*** ERROR: No ethernet found.\n");
1401                                 return 1;
1402                         case 0:
1403                                 puts("*** ERROR: `ethaddr' not set\n");
1404                                 break;
1405                         default:
1406                                 printf("*** ERROR: `eth%daddr' not set\n",
1407                                        num);
1408                                 break;
1409                         }
1410
1411                         net_start_again();
1412                         return 2;
1413                 }
1414                 /* Fall through */
1415         default:
1416                 return 0;
1417         }
1418         return 0;               /* OK */
1419 }
1420 /**********************************************************************/
1421
1422 int
1423 net_eth_hdr_size(void)
1424 {
1425         ushort myvlanid;
1426
1427         myvlanid = ntohs(net_our_vlan);
1428         if (myvlanid == (ushort)-1)
1429                 myvlanid = VLAN_NONE;
1430
1431         return ((myvlanid & VLAN_IDMASK) == VLAN_NONE) ? ETHER_HDR_SIZE :
1432                 VLAN_ETHER_HDR_SIZE;
1433 }
1434
1435 int net_set_ether(uchar *xet, const uchar *dest_ethaddr, uint prot)
1436 {
1437         struct ethernet_hdr *et = (struct ethernet_hdr *)xet;
1438         ushort myvlanid;
1439
1440         myvlanid = ntohs(net_our_vlan);
1441         if (myvlanid == (ushort)-1)
1442                 myvlanid = VLAN_NONE;
1443
1444         memcpy(et->et_dest, dest_ethaddr, 6);
1445         memcpy(et->et_src, net_ethaddr, 6);
1446         if ((myvlanid & VLAN_IDMASK) == VLAN_NONE) {
1447                 et->et_protlen = htons(prot);
1448                 return ETHER_HDR_SIZE;
1449         } else {
1450                 struct vlan_ethernet_hdr *vet =
1451                         (struct vlan_ethernet_hdr *)xet;
1452
1453                 vet->vet_vlan_type = htons(PROT_VLAN);
1454                 vet->vet_tag = htons((0 << 5) | (myvlanid & VLAN_IDMASK));
1455                 vet->vet_type = htons(prot);
1456                 return VLAN_ETHER_HDR_SIZE;
1457         }
1458 }
1459
1460 int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot)
1461 {
1462         ushort protlen;
1463
1464         memcpy(et->et_dest, addr, 6);
1465         memcpy(et->et_src, net_ethaddr, 6);
1466         protlen = ntohs(et->et_protlen);
1467         if (protlen == PROT_VLAN) {
1468                 struct vlan_ethernet_hdr *vet =
1469                         (struct vlan_ethernet_hdr *)et;
1470                 vet->vet_type = htons(prot);
1471                 return VLAN_ETHER_HDR_SIZE;
1472         } else if (protlen > 1514) {
1473                 et->et_protlen = htons(prot);
1474                 return ETHER_HDR_SIZE;
1475         } else {
1476                 /* 802.2 + SNAP */
1477                 struct e802_hdr *et802 = (struct e802_hdr *)et;
1478                 et802->et_prot = htons(prot);
1479                 return E802_HDR_SIZE;
1480         }
1481 }
1482
1483 void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source,
1484                        u16 pkt_len, u8 proto)
1485 {
1486         struct ip_udp_hdr *ip = (struct ip_udp_hdr *)pkt;
1487
1488         /*
1489          *      Construct an IP header.
1490          */
1491         /* IP_HDR_SIZE / 4 (not including UDP) */
1492         ip->ip_hl_v  = 0x45;
1493         ip->ip_tos   = 0;
1494         ip->ip_len   = htons(pkt_len);
1495         ip->ip_p     = proto;
1496         ip->ip_id    = htons(net_ip_id++);
1497         ip->ip_off   = htons(IP_FLAGS_DFRAG);   /* Don't fragment */
1498         ip->ip_ttl   = 255;
1499         ip->ip_sum   = 0;
1500         /* already in network byte order */
1501         net_copy_ip((void *)&ip->ip_src, &source);
1502         /* already in network byte order */
1503         net_copy_ip((void *)&ip->ip_dst, &dest);
1504
1505         ip->ip_sum   = compute_ip_checksum(ip, IP_HDR_SIZE);
1506 }
1507
1508 void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport, int sport,
1509                         int len)
1510 {
1511         struct ip_udp_hdr *ip = (struct ip_udp_hdr *)pkt;
1512
1513         /*
1514          *      If the data is an odd number of bytes, zero the
1515          *      byte after the last byte so that the checksum
1516          *      will work.
1517          */
1518         if (len & 1)
1519                 pkt[IP_UDP_HDR_SIZE + len] = 0;
1520
1521         net_set_ip_header(pkt, dest, net_ip, IP_UDP_HDR_SIZE + len,
1522                           IPPROTO_UDP);
1523
1524         ip->udp_src  = htons(sport);
1525         ip->udp_dst  = htons(dport);
1526         ip->udp_len  = htons(UDP_HDR_SIZE + len);
1527         ip->udp_xsum = 0;
1528 }
1529
1530 void copy_filename(char *dst, const char *src, int size)
1531 {
1532         if (src && *src && (*src == '"')) {
1533                 ++src;
1534                 --size;
1535         }
1536
1537         while ((--size > 0) && src && *src && (*src != '"'))
1538                 *dst++ = *src++;
1539         *dst = '\0';
1540 }
1541
1542 int is_serverip_in_cmd(void)
1543 {
1544         return !!strchr(net_boot_file_name, ':');
1545 }
1546
1547 int net_parse_bootfile(struct in_addr *ipaddr, char *filename, int max_len)
1548 {
1549         char *colon;
1550
1551         if (net_boot_file_name[0] == '\0')
1552                 return 0;
1553
1554         colon = strchr(net_boot_file_name, ':');
1555         if (colon) {
1556                 if (ipaddr)
1557                         *ipaddr = string_to_ip(net_boot_file_name);
1558                 strncpy(filename, colon + 1, max_len);
1559         } else {
1560                 strncpy(filename, net_boot_file_name, max_len);
1561         }
1562         filename[max_len - 1] = '\0';
1563
1564         return 1;
1565 }
1566
1567 void ip_to_string(struct in_addr x, char *s)
1568 {
1569         x.s_addr = ntohl(x.s_addr);
1570         sprintf(s, "%d.%d.%d.%d",
1571                 (int) ((x.s_addr >> 24) & 0xff),
1572                 (int) ((x.s_addr >> 16) & 0xff),
1573                 (int) ((x.s_addr >> 8) & 0xff),
1574                 (int) ((x.s_addr >> 0) & 0xff)
1575         );
1576 }
1577
1578 void vlan_to_string(ushort x, char *s)
1579 {
1580         x = ntohs(x);
1581
1582         if (x == (ushort)-1)
1583                 x = VLAN_NONE;
1584
1585         if (x == VLAN_NONE)
1586                 strcpy(s, "none");
1587         else
1588                 sprintf(s, "%d", x & VLAN_IDMASK);
1589 }
1590
1591 ushort string_to_vlan(const char *s)
1592 {
1593         ushort id;
1594
1595         if (s == NULL)
1596                 return htons(VLAN_NONE);
1597
1598         if (*s < '0' || *s > '9')
1599                 id = VLAN_NONE;
1600         else
1601                 id = (ushort)simple_strtoul(s, NULL, 10);
1602
1603         return htons(id);
1604 }
1605
1606 ushort env_get_vlan(char *var)
1607 {
1608         return string_to_vlan(env_get(var));
1609 }