1
2
3
4
5
6
7
8
9
10
11
12#ifndef __NET_H__
13#define __NET_H__
14
15#include <linux/types.h>
16#include <asm/cache.h>
17#include <asm/byteorder.h>
18#include <env.h>
19#include <log.h>
20#include <time.h>
21#include <linux/if_ether.h>
22#include <rand.h>
23
24struct bd_info;
25struct cmd_tbl;
26struct udevice;
27
28#define DEBUG_LL_STATE 0
29#define DEBUG_DEV_PKT 0
30#define DEBUG_NET_PKT 0
31#define DEBUG_INT_STATE 0
32
33
34
35
36
37
38
39#ifdef CONFIG_SYS_RX_ETH_BUFFER
40# define PKTBUFSRX CONFIG_SYS_RX_ETH_BUFFER
41#else
42# define PKTBUFSRX 4
43#endif
44
45#define PKTALIGN ARCH_DMA_MINALIGN
46
47
48#define ETH_PACKETS_BATCH_RECV 32
49
50
51#define ARP_HLEN 6
52
53
54
55
56#define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1)
57
58
59struct in_addr {
60 __be32 s_addr;
61};
62
63
64
65
66
67
68
69
70
71
72int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
73
74
75
76
77
78
79
80
81
82typedef void rxhand_f(uchar *pkt, unsigned dport,
83 struct in_addr sip, unsigned sport,
84 unsigned len);
85
86
87
88
89
90
91
92
93
94
95
96typedef void rxhand_icmp_f(unsigned type, unsigned code, unsigned dport,
97 struct in_addr sip, unsigned sport, uchar *pkt, unsigned len);
98
99
100
101
102typedef void thand_f(void);
103
104enum eth_state_t {
105 ETH_STATE_INIT,
106 ETH_STATE_PASSIVE,
107 ETH_STATE_ACTIVE
108};
109
110#ifdef CONFIG_DM_ETH
111
112
113
114
115
116
117
118
119
120struct eth_pdata {
121 phys_addr_t iobase;
122 unsigned char enetaddr[ARP_HLEN];
123 int phy_interface;
124 int max_speed;
125 void *priv_pdata;
126};
127
128enum eth_recv_flags {
129
130
131
132
133 ETH_RECV_CHECK_DEVICE = 1 << 0,
134};
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163struct eth_ops {
164 int (*start)(struct udevice *dev);
165 int (*send)(struct udevice *dev, void *packet, int length);
166 int (*recv)(struct udevice *dev, int flags, uchar **packetp);
167 int (*free_pkt)(struct udevice *dev, uchar *packet, int length);
168 void (*stop)(struct udevice *dev);
169 int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join);
170 int (*write_hwaddr)(struct udevice *dev);
171 int (*read_rom_hwaddr)(struct udevice *dev);
172 int (*set_promisc)(struct udevice *dev, bool enable);
173};
174
175#define eth_get_ops(dev) ((struct eth_ops *)(dev)->driver->ops)
176
177struct udevice *eth_get_dev(void);
178
179
180
181
182struct udevice *eth_get_dev_by_name(const char *devname);
183unsigned char *eth_get_ethaddr(void);
184
185
186int eth_is_active(struct udevice *dev);
187int eth_init_state_only(void);
188void eth_halt_state_only(void);
189#endif
190
191#ifndef CONFIG_DM_ETH
192struct eth_device {
193#define ETH_NAME_LEN 20
194 char name[ETH_NAME_LEN];
195 unsigned char enetaddr[ARP_HLEN];
196 phys_addr_t iobase;
197 int state;
198
199 int (*init)(struct eth_device *eth, struct bd_info *bd);
200 int (*send)(struct eth_device *, void *packet, int length);
201 int (*recv)(struct eth_device *);
202 void (*halt)(struct eth_device *);
203 int (*mcast)(struct eth_device *, const u8 *enetaddr, int join);
204 int (*write_hwaddr)(struct eth_device *eth);
205 struct eth_device *next;
206 int index;
207 void *priv;
208};
209
210int eth_register(struct eth_device *dev);
211int eth_unregister(struct eth_device *dev);
212
213extern struct eth_device *eth_current;
214
215static __always_inline struct eth_device *eth_get_dev(void)
216{
217 return eth_current;
218}
219struct eth_device *eth_get_dev_by_name(const char *devname);
220struct eth_device *eth_get_dev_by_index(int index);
221
222
223static inline unsigned char *eth_get_ethaddr(void)
224{
225 if (eth_current)
226 return eth_current->enetaddr;
227 return NULL;
228}
229
230
231int eth_is_active(struct eth_device *dev);
232
233static __always_inline int eth_init_state_only(void)
234{
235 eth_get_dev()->state = ETH_STATE_ACTIVE;
236
237 return 0;
238}
239
240static __always_inline void eth_halt_state_only(void)
241{
242 eth_get_dev()->state = ETH_STATE_PASSIVE;
243}
244
245
246
247
248
249
250
251
252
253
254int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
255 int eth_number);
256
257int usb_eth_initialize(struct bd_info *bi);
258#endif
259
260int eth_initialize(void);
261void eth_try_another(int first_restart);
262void eth_set_current(void);
263
264int eth_get_dev_index(void);
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279int eth_env_set_enetaddr_by_index(const char *base_name, int index,
280 uchar *enetaddr);
281
282
283
284
285
286
287
288int usb_ether_init(void);
289
290
291
292
293
294
295
296
297
298
299int eth_env_get_enetaddr_by_index(const char *base_name, int index,
300 uchar *enetaddr);
301
302int eth_init(void);
303int eth_send(void *packet, int length);
304
305#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
306int eth_receive(void *packet, int length);
307extern void (*push_packet)(void *packet, int length);
308#endif
309int eth_rx(void);
310void eth_halt(void);
311const char *eth_get_name(void);
312int eth_mcast_join(struct in_addr mcast_addr, int join);
313
314
315
316
317
318
319
320
321
322
323struct ethernet_hdr {
324 u8 et_dest[ARP_HLEN];
325 u8 et_src[ARP_HLEN];
326 u16 et_protlen;
327} __attribute__((packed));
328
329
330#define ETHER_HDR_SIZE (sizeof(struct ethernet_hdr))
331
332#define ETH_FCS_LEN 4
333
334struct e802_hdr {
335 u8 et_dest[ARP_HLEN];
336 u8 et_src[ARP_HLEN];
337 u16 et_protlen;
338 u8 et_dsap;
339 u8 et_ssap;
340 u8 et_ctl;
341 u8 et_snap1;
342 u8 et_snap2;
343 u8 et_snap3;
344 u16 et_prot;
345} __attribute__((packed));
346
347
348#define E802_HDR_SIZE (sizeof(struct e802_hdr))
349
350
351
352
353struct vlan_ethernet_hdr {
354 u8 vet_dest[ARP_HLEN];
355 u8 vet_src[ARP_HLEN];
356 u16 vet_vlan_type;
357 u16 vet_tag;
358 u16 vet_type;
359} __attribute__((packed));
360
361
362#define VLAN_ETHER_HDR_SIZE (sizeof(struct vlan_ethernet_hdr))
363
364#define PROT_IP 0x0800
365#define PROT_ARP 0x0806
366#define PROT_WOL 0x0842
367#define PROT_RARP 0x8035
368#define PROT_VLAN 0x8100
369#define PROT_IPV6 0x86dd
370#define PROT_PPP_SES 0x8864
371#define PROT_NCSI 0x88f8
372
373#define IPPROTO_ICMP 1
374#define IPPROTO_UDP 17
375
376
377
378
379struct ip_hdr {
380 u8 ip_hl_v;
381 u8 ip_tos;
382 u16 ip_len;
383 u16 ip_id;
384 u16 ip_off;
385 u8 ip_ttl;
386 u8 ip_p;
387 u16 ip_sum;
388 struct in_addr ip_src;
389 struct in_addr ip_dst;
390} __attribute__((packed));
391
392#define IP_OFFS 0x1fff
393#define IP_FLAGS 0xe000
394#define IP_FLAGS_RES 0x8000
395#define IP_FLAGS_DFRAG 0x4000
396#define IP_FLAGS_MFRAG 0x2000
397
398#define IP_HDR_SIZE (sizeof(struct ip_hdr))
399
400
401
402
403struct ip_udp_hdr {
404 u8 ip_hl_v;
405 u8 ip_tos;
406 u16 ip_len;
407 u16 ip_id;
408 u16 ip_off;
409 u8 ip_ttl;
410 u8 ip_p;
411 u16 ip_sum;
412 struct in_addr ip_src;
413 struct in_addr ip_dst;
414 u16 udp_src;
415 u16 udp_dst;
416 u16 udp_len;
417 u16 udp_xsum;
418} __attribute__((packed));
419
420#define IP_UDP_HDR_SIZE (sizeof(struct ip_udp_hdr))
421#define UDP_HDR_SIZE (IP_UDP_HDR_SIZE - IP_HDR_SIZE)
422
423
424
425
426struct arp_hdr {
427 u16 ar_hrd;
428# define ARP_ETHER 1
429 u16 ar_pro;
430 u8 ar_hln;
431 u8 ar_pln;
432# define ARP_PLEN 4
433 u16 ar_op;
434# define ARPOP_REQUEST 1
435# define ARPOP_REPLY 2
436
437# define RARPOP_REQUEST 3
438# define RARPOP_REPLY 4
439
440
441
442
443
444
445 u8 ar_data[0];
446#define ar_sha ar_data[0]
447#define ar_spa ar_data[ARP_HLEN]
448#define ar_tha ar_data[ARP_HLEN + ARP_PLEN]
449#define ar_tpa ar_data[ARP_HLEN + ARP_PLEN + ARP_HLEN]
450#if 0
451 u8 ar_sha[];
452 u8 ar_spa[];
453 u8 ar_tha[];
454 u8 ar_tpa[];
455#endif
456} __attribute__((packed));
457
458#define ARP_HDR_SIZE (8+20)
459
460
461
462
463#define ICMP_ECHO_REPLY 0
464#define ICMP_NOT_REACH 3
465#define ICMP_REDIRECT 5
466#define ICMP_ECHO_REQUEST 8
467
468
469#define ICMP_REDIR_NET 0
470#define ICMP_REDIR_HOST 1
471
472
473#define ICMP_NOT_REACH_PORT 3
474
475struct icmp_hdr {
476 u8 type;
477 u8 code;
478 u16 checksum;
479 union {
480 struct {
481 u16 id;
482 u16 sequence;
483 } echo;
484 u32 gateway;
485 struct {
486 u16 unused;
487 u16 mtu;
488 } frag;
489 u8 data[0];
490 } un;
491} __attribute__((packed));
492
493#define ICMP_HDR_SIZE (sizeof(struct icmp_hdr))
494#define IP_ICMP_HDR_SIZE (IP_HDR_SIZE + ICMP_HDR_SIZE)
495
496
497
498
499
500
501
502
503#define PKTSIZE 1522
504#ifndef CONFIG_DM_DSA
505#define PKTSIZE_ALIGN 1536
506#else
507
508#define DSA_MAX_OVR 256
509#define PKTSIZE_ALIGN (1536 + DSA_MAX_OVR)
510#endif
511
512
513
514
515
516
517
518#define RINGSZ 4
519#define RINGSZ_LOG2 2
520
521
522
523
524
525
526
527
528
529
530
531
532
533extern struct in_addr net_gateway;
534extern struct in_addr net_netmask;
535
536extern struct in_addr net_dns_server;
537#if defined(CONFIG_BOOTP_DNS2)
538
539extern struct in_addr net_dns_server2;
540#endif
541extern char net_nis_domain[32];
542extern char net_hostname[32];
543extern char net_root_path[64];
544
545extern u8 net_ethaddr[ARP_HLEN];
546extern u8 net_server_ethaddr[ARP_HLEN];
547extern struct in_addr net_ip;
548extern struct in_addr net_server_ip;
549extern uchar *net_tx_packet;
550extern uchar *net_rx_packets[PKTBUFSRX];
551extern uchar *net_rx_packet;
552extern int net_rx_packet_len;
553extern const u8 net_bcast_ethaddr[ARP_HLEN];
554extern const u8 net_null_ethaddr[ARP_HLEN];
555
556#define VLAN_NONE 4095
557#define VLAN_IDMASK 0x0fff
558extern ushort net_our_vlan;
559extern ushort net_native_vlan;
560
561extern int net_restart_wrap;
562
563enum proto_t {
564 BOOTP, RARP, ARP, TFTPGET, DHCP, PING, DNS, NFS, CDP, NETCONS, SNTP,
565 TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT, WOL, UDP
566};
567
568extern char net_boot_file_name[1024];
569
570extern bool net_boot_file_name_explicit;
571
572extern u32 net_boot_file_size;
573
574extern u32 net_boot_file_expected_size_in_blocks;
575
576#if defined(CONFIG_CMD_DNS)
577extern char *net_dns_resolve;
578extern char *net_dns_env_var;
579#endif
580
581#if defined(CONFIG_CMD_PING)
582extern struct in_addr net_ping_ip;
583#endif
584
585#if defined(CONFIG_CMD_CDP)
586
587extern ushort cdp_native_vlan;
588extern ushort cdp_appliance_vlan;
589
590
591
592
593static inline int is_cdp_packet(const uchar *ethaddr)
594{
595 extern const u8 net_cdp_ethaddr[ARP_HLEN];
596
597 return memcmp(ethaddr, net_cdp_ethaddr, ARP_HLEN) == 0;
598}
599#endif
600
601#if defined(CONFIG_CMD_SNTP)
602extern struct in_addr net_ntp_server;
603extern int net_ntp_time_offset;
604#endif
605
606
607int net_init(void);
608int net_loop(enum proto_t);
609
610
611int net_start_again(void);
612
613
614int net_eth_hdr_size(void);
615
616
617int net_set_ether(uchar *xet, const uchar *dest_ethaddr, uint prot);
618int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot);
619
620
621void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source,
622 u16 pkt_len, u8 proto);
623void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport,
624 int sport, int len);
625
626
627
628
629
630
631
632
633unsigned compute_ip_checksum(const void *addr, unsigned nbytes);
634
635
636
637
638
639
640
641
642
643unsigned add_ip_checksums(unsigned offset, unsigned sum, unsigned new_sum);
644
645
646
647
648
649
650
651
652
653
654int ip_checksum_ok(const void *addr, unsigned nbytes);
655
656
657rxhand_f *net_get_udp_handler(void);
658void net_set_udp_handler(rxhand_f *);
659rxhand_f *net_get_arp_handler(void);
660void net_set_arp_handler(rxhand_f *);
661bool arp_is_waiting(void);
662void net_set_icmp_handler(rxhand_icmp_f *f);
663void net_set_timeout_handler(ulong, thand_f *);
664
665
666enum net_loop_state {
667 NETLOOP_CONTINUE,
668 NETLOOP_RESTART,
669 NETLOOP_SUCCESS,
670 NETLOOP_FAIL
671};
672extern enum net_loop_state net_state;
673
674static inline void net_set_state(enum net_loop_state state)
675{
676 debug_cond(DEBUG_INT_STATE, "--- NetState set to %d\n", state);
677 net_state = state;
678}
679
680
681
682
683
684
685
686uchar * net_get_async_tx_pkt_buf(void);
687
688
689static inline void net_send_packet(uchar *pkt, int len)
690{
691
692 (void) eth_send(pkt, len);
693}
694
695
696
697
698
699
700
701
702
703
704
705int net_send_ip_packet(uchar *ether, struct in_addr dest, int dport, int sport,
706 int payload_len, int proto, u8 action, u32 tcp_seq_num,
707 u32 tcp_ack_num);
708int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport,
709 int sport, int payload_len);
710
711
712void net_process_received_packet(uchar *in_packet, int len);
713
714#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
715void nc_start(void);
716int nc_input_packet(uchar *pkt, struct in_addr src_ip, unsigned dest_port,
717 unsigned src_port, unsigned len);
718#endif
719
720static __always_inline int eth_is_on_demand_init(void)
721{
722#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
723 extern enum proto_t net_loop_last_protocol;
724
725 return net_loop_last_protocol != NETCONS;
726#else
727 return 1;
728#endif
729}
730
731static inline void eth_set_last_protocol(int protocol)
732{
733#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
734 extern enum proto_t net_loop_last_protocol;
735
736 net_loop_last_protocol = protocol;
737#endif
738}
739
740
741
742
743
744void net_auto_load(void);
745
746
747
748
749
750
751
752
753
754static inline struct in_addr net_read_ip(void *from)
755{
756 struct in_addr ip;
757
758 memcpy((void *)&ip, (void *)from, sizeof(ip));
759 return ip;
760}
761
762
763static inline u32 net_read_u32(void *from)
764{
765 u32 l;
766
767 memcpy((void *)&l, (void *)from, sizeof(l));
768 return l;
769}
770
771
772static inline void net_write_ip(void *to, struct in_addr ip)
773{
774 memcpy(to, (void *)&ip, sizeof(ip));
775}
776
777
778static inline void net_copy_ip(void *to, void *from)
779{
780 memcpy((void *)to, from, sizeof(struct in_addr));
781}
782
783
784static inline void net_copy_u32(void *to, void *from)
785{
786 memcpy((void *)to, (void *)from, sizeof(u32));
787}
788
789
790
791
792
793
794
795static inline int is_zero_ethaddr(const u8 *addr)
796{
797 return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
798}
799
800
801
802
803
804
805
806
807static inline int is_multicast_ethaddr(const u8 *addr)
808{
809 return 0x01 & addr[0];
810}
811
812
813
814
815
816
817
818static inline int is_broadcast_ethaddr(const u8 *addr)
819{
820 return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) ==
821 0xff;
822}
823
824
825
826
827
828
829
830
831
832
833static inline int is_valid_ethaddr(const u8 *addr)
834{
835
836
837 return !is_multicast_ethaddr(addr) && !is_zero_ethaddr(addr);
838}
839
840
841
842
843
844
845
846
847static inline void net_random_ethaddr(uchar *addr)
848{
849 int i;
850 unsigned int seed = get_ticks();
851
852 for (i = 0; i < 6; i++)
853 addr[i] = rand_r(&seed);
854
855 addr[0] &= 0xfe;
856 addr[0] |= 0x02;
857}
858
859
860
861
862
863
864
865
866
867
868
869
870void string_to_enetaddr(const char *addr, uint8_t *enetaddr);
871
872
873void ip_to_string(struct in_addr x, char *s);
874
875
876
877
878
879
880
881
882
883struct in_addr string_to_ip(const char *s);
884
885
886void vlan_to_string(ushort x, char *s);
887
888
889ushort string_to_vlan(const char *s);
890
891
892ushort env_get_vlan(char *);
893
894
895void copy_filename(char *dst, const char *src, int size);
896
897
898int is_serverip_in_cmd(void);
899
900
901
902
903
904
905
906
907
908
909int net_parse_bootfile(struct in_addr *ipaddr, char *filename, int max_len);
910
911
912
913
914
915
916
917
918
919
920
921
922int update_tftp(ulong addr, char *interface, char *devstring);
923
924
925
926
927
928
929
930
931
932static inline struct in_addr env_get_ip(char *var)
933{
934 return string_to_ip(env_get(var));
935}
936
937
938
939
940
941
942void reset_phy(void);
943
944#endif
945