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