X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Fnet.h;h=a092f291bbcd643b8eda122b10b0509d1fd4b719;hb=e034ea3b77baf90ab8dde2c1beeb22704b01fb2d;hp=eeea466d659442cefd30b71ee7869554e9069efb;hpb=738853bb6d290dc4b52d8c2989c0998d7aa26913;p=u-boot diff --git a/include/net.h b/include/net.h index eeea466d65..a092f291bb 100644 --- a/include/net.h +++ b/include/net.h @@ -19,6 +19,10 @@ #include #include /* for nton* / ntoh* stuff */ +#define DEBUG_LL_STATE 0 /* Link local state machine changes */ +#define DEBUG_DEV_PKT 0 /* Packets or info directed to the device */ +#define DEBUG_NET_PKT 0 /* Packets on info on the network at large */ +#define DEBUG_INT_STATE 0 /* Internal network state changes */ /* * The number of receive packet buffers, and the required packet buffer @@ -179,11 +183,11 @@ struct e802_hdr { ushort et_prot; /* 802 protocol */ }; -/* 802 ethernet header size */ +/* 802 + SNAP + ethernet header size */ #define E802_HDR_SIZE (sizeof(struct e802_hdr)) /* - * Ethernet header + * Virtual LAN Ethernet header */ struct vlan_ethernet_hdr { uchar vet_dest[6]; /* Destination node */ @@ -259,7 +263,9 @@ struct arp_hdr { # define ARP_ETHER 1 /* Ethernet hardware address */ ushort ar_pro; /* Format of protocol address */ uchar ar_hln; /* Length of hardware address */ +# define ARP_HLEN 6 uchar ar_pln; /* Length of protocol address */ +# define ARP_PLEN 4 ushort ar_op; /* Operation */ # define ARPOP_REQUEST 1 /* Request to resolve address */ # define ARPOP_REPLY 2 /* Response to previous request */ @@ -273,6 +279,10 @@ struct arp_hdr { * specific hardware/protocol combinations. */ uchar ar_data[0]; +#define ar_sha ar_data[0] +#define ar_spa ar_data[ARP_HLEN] +#define ar_tha ar_data[ARP_HLEN + ARP_PLEN] +#define ar_tpa ar_data[ARP_HLEN + ARP_PLEN + ARP_HLEN] #if 0 uchar ar_sha[]; /* Sender hardware address */ uchar ar_spa[]; /* Sender protocol address */ @@ -298,7 +308,7 @@ struct arp_hdr { /* Codes for NOT_REACH */ #define ICMP_NOT_REACH_PORT 3 /* Port unreachable */ -typedef struct icmphdr { +struct icmp_hdr { uchar type; uchar code; ushort checksum; @@ -314,8 +324,10 @@ typedef struct icmphdr { } frag; uchar data[0]; } un; -} ICMP_t; +}; +#define ICMP_HDR_SIZE (sizeof(struct icmp_hdr)) +#define IP_ICMP_HDR_SIZE (IP_HDR_SIZE + ICMP_HDR_SIZE) /* * Maximum packet size; used to allocate packet storage. @@ -383,17 +395,11 @@ extern uchar NetEtherNullAddr[6]; extern ushort NetOurVLAN; /* Our VLAN */ extern ushort NetOurNativeVLAN; /* Our Native VLAN */ -extern int NetState; /* Network loop state */ -#define NETLOOP_CONTINUE 1 -#define NETLOOP_RESTART 2 -#define NETLOOP_SUCCESS 3 -#define NETLOOP_FAIL 4 - extern int NetRestartWrap; /* Tried all network devices */ enum proto_t { BOOTP, RARP, ARP, TFTPGET, DHCP, PING, DNS, NFS, CDP, NETCONS, SNTP, - TFTPSRV, TFTPPUT + TFTPSRV, TFTPPUT, LINKLOCAL }; /* from net/net.c */ @@ -434,6 +440,7 @@ extern IPaddr_t Mcast_addr; #endif /* Initialize the network adapter */ +extern void net_init(void); extern int NetLoop(enum proto_t); /* Shutdown adapters and cleanup */ @@ -447,26 +454,58 @@ extern int NetEthHdrSize(void); /* Set ethernet header; returns the size of the header */ extern int NetSetEther(uchar *, uchar *, uint); +extern int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot); /* Set IP header */ -extern void NetSetIP(uchar *, IPaddr_t, int, int, int); +extern void net_set_ip_header(uchar *pkt, IPaddr_t dest, IPaddr_t source); +extern void net_set_udp_header(uchar *pkt, IPaddr_t dest, int dport, + int sport, int len); /* Checksum */ extern int NetCksumOk(uchar *, int); /* Return true if cksum OK */ extern uint NetCksum(uchar *, int); /* Calculate the checksum */ /* Callbacks */ -extern rxhand_f *NetGetHandler(void); /* Get RX packet handler */ -extern void NetSetHandler(rxhand_f *); /* Set RX packet handler */ +extern rxhand_f *net_get_udp_handler(void); /* Get UDP RX packet handler */ +extern void net_set_udp_handler(rxhand_f *); /* Set UDP RX packet handler */ +extern rxhand_f *net_get_arp_handler(void); /* Get ARP RX packet handler */ +extern void net_set_arp_handler(rxhand_f *); /* Set ARP RX packet handler */ extern void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */ extern void NetSetTimeout(ulong, thand_f *);/* Set timeout handler */ -/* Transmit "NetTxPacket" */ -extern void NetSendPacket(uchar *, int); +/* Network loop state */ +enum net_loop_state { + NETLOOP_CONTINUE, + NETLOOP_RESTART, + NETLOOP_SUCCESS, + NETLOOP_FAIL +}; +static inline void net_set_state(enum net_loop_state state) +{ + extern enum net_loop_state net_state; + + debug_cond(DEBUG_INT_STATE, "--- NetState set to %d\n", state); + net_state = state; +} -/* Transmit UDP packet, performing ARP request if needed */ -extern int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, - int sport, int len); +/* Transmit a packet */ +static inline void NetSendPacket(uchar *pkt, int len) +{ + (void) eth_send(pkt, len); +} + +/* + * Transmit "NetTxPacket" as UDP packet, performing ARP request if needed + * (ether will be populated) + * + * @param ether Raw packet buffer + * @param dest IP address to send the datagram to + * @param dport Destination UDP port + * @param sport Source UDP port + * @param payload_len Length of data after the UDP header + */ +extern int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, + int sport, int payload_len); /* Processes a received packet */ extern void NetReceive(uchar *, int);