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