diff packages/redboot/current/include/net/net.h @ 115:6ed91473a1cd ecos-sw-2000-08-21

Merge from eCos master repository on 2000-08-21-22:40:54-BST
author jlarmour
date Fri, 25 Aug 2000 17:32:38 +0000
parents
children 0ae0bc38e387
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/redboot/current/include/net/net.h
@@ -0,0 +1,577 @@
+//==========================================================================
+//
+//      net/net.h
+//
+//      Stand-alone networking support for RedBoot
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//                                                                          
+// -------------------------------------------                              
+// The contents of this file are subject to the Red Hat eCos Public License 
+// Version 1.1 (the "License"); you may not use this file except in         
+// compliance with the License.  You may obtain a copy of the License at    
+// http://www.redhat.com/                                                   
+//                                                                          
+// Software distributed under the License is distributed on an "AS IS"      
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the 
+// License for the specific language governing rights and limitations under 
+// the License.                                                             
+//                                                                          
+// The Original Code is eCos - Embedded Configurable Operating System,      
+// released September 30, 1998.                                             
+//                                                                          
+// The Initial Developer of the Original Code is Red Hat.                   
+// Portions created by Red Hat are                                          
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.                             
+// All Rights Reserved.                                                     
+// -------------------------------------------                              
+//                                                                          
+//####COPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    gthomas
+// Contributors: gthomas
+// Date:         2000-07-14
+// Purpose:      
+// Description:  
+//              
+// This code is part of RedBoot (tm).
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#ifndef _NET_H_
+#define _NET_H_
+
+#include <pkgconf/redboot.h>
+#include <cyg/hal/hal_arch.h>
+#include <cyg/hal/basetype.h>
+
+extern bool net_debug;
+
+extern unsigned long do_ms_tick(void);
+#define MS_TICKS() do_ms_tick()
+
+/* #define NET_SUPPORT_RARP  1 */
+#define NET_SUPPORT_ICMP 1
+#define NET_SUPPORT_UDP  1
+#define NET_SUPPORT_TCP  1
+
+#if (CYG_BYTEORDER == CYG_LSBFIRST)
+#ifndef __LITTLE_ENDIAN__
+#define __LITTLE_ENDIAN__
+#endif
+extern unsigned long  ntohl(unsigned long x);
+extern unsigned long  ntohs(unsigned short x);
+#else
+#define	ntohl(x)	(x)
+#define	ntohs(x)	(x)
+#endif
+
+#define	htonl(x)	ntohl(x)
+#define	htons(x)	ntohs(x)
+
+/*
+ * Minimum ethernet packet length.
+ */
+#define ETH_MIN_PKTLEN  60
+#define ETH_MAX_PKTLEN  1514
+
+typedef unsigned char enet_addr_t[6];
+typedef unsigned char ip_addr_t[4];
+
+typedef unsigned char  octet;
+typedef unsigned short word;
+typedef unsigned int   dword;
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+// IPv4 support
+typedef struct in_addr {
+    unsigned long  s_addr;  // IPv4 address
+} in_addr_t;
+
+// Socket/connection information
+struct sockaddr_in {
+    struct in_addr sin_addr;
+    unsigned short sin_port;
+    unsigned short sin_family;
+    short          sin_len;
+};
+#define AF_INET      1
+#define INADDR_ANY   0
+
+struct timeval {
+    unsigned long tv_sec;
+    unsigned long tv_usec;
+};
+
+/*
+ * Simple timer support structure.
+ */
+typedef void (*tmr_handler_t)(void *user_data);
+
+/*
+ * Timer structure.
+ * When expiration time is met or exceeded, the handler is
+ * called and the timer struct is removed from the list.
+ */
+typedef struct _timer {
+    struct _timer *next;        /* next timer in list */
+    unsigned long delay;	/* expiration time relative to start time */
+    unsigned long start;	/* when the timer was set */
+    tmr_handler_t handler;      /* user procedure to call when timer 'fires' */
+    void          *user_data;   /* user pointer passed to above procedure */
+} timer_t;
+
+
+/*
+ * Ethernet header.
+ */
+typedef struct {
+    enet_addr_t   destination;
+    enet_addr_t   source;
+    word          type;
+#define ETH_TYPE_IP   0x800
+#define ETH_TYPE_ARP  0x806
+#define ETH_TYPE_RARP 0x8053
+} eth_header_t;
+
+
+/*
+ * ARP/RARP header.
+ */
+typedef struct {
+    word	hw_type;
+#define ARP_HW_ETHER 1
+#define ARP_HW_EXP_ETHER 2
+    word	protocol;
+    octet	hw_len;
+    octet	proto_len;
+    word	opcode;
+#define	ARP_REQUEST	1
+#define	ARP_REPLY	2
+#define	RARP_REQUEST	3
+#define	RARP_REPLY	4
+    enet_addr_t	sender_enet;
+    ip_addr_t	sender_ip;
+    enet_addr_t	target_enet;
+    ip_addr_t	target_ip;
+} arp_header_t;
+
+
+#define ARP_PKT_SIZE  (sizeof(arp_header_t) + sizeof(eth_header_t))
+
+/*
+ * Internet Protocol header.
+ */
+typedef struct {
+#ifdef __LITTLE_ENDIAN__
+    octet       hdr_len:4,
+                version:4;
+#else
+    octet       version:4,
+                hdr_len:4;
+#endif
+    octet       tos;
+    word        length;
+    word        ident;
+    word        fragment;
+    octet       ttl;
+    octet       protocol;
+#define IP_PROTO_ICMP  1
+#define IP_PROTO_TCP   6
+#define IP_PROTO_UDP  17
+    word        checksum;
+    ip_addr_t   source;
+    ip_addr_t   destination;
+} ip_header_t;
+
+
+#define IP_PKT_SIZE (60 + sizeof(eth_header_t))
+
+
+/*
+ * A IP<->ethernet address mapping.
+ */
+typedef struct {
+    ip_addr_t    ip_addr;
+    enet_addr_t  enet_addr;
+} ip_route_t;
+
+
+/*
+ * UDP header.
+ */
+typedef struct {
+    word	src_port;
+    word	dest_port;
+    word	length;
+    word	checksum;
+} udp_header_t;
+
+
+/*
+ * TCP header.
+ */
+typedef struct {
+    word	src_port;
+    word	dest_port;
+    dword	seqnum;
+    dword	acknum;
+#ifdef __LITTLE_ENDIAN__
+    octet       reserved:4,
+                hdr_len:4;
+#else
+    octet       hdr_len:4,
+                reserved:4;
+#endif
+    octet	flags;
+#define TCP_FLAG_FIN  1
+#define TCP_FLAG_SYN  2
+#define TCP_FLAG_RST  4
+#define TCP_FLAG_PSH  8
+#define TCP_FLAG_ACK 16
+#define TCP_FLAG_URG 32
+    word	window;
+    word	checksum;
+    word	urgent;
+} tcp_header_t;
+
+
+/*
+ * ICMP header.
+ */
+typedef struct {
+    octet	type;
+#define ICMP_TYPE_ECHOREPLY   0
+#define ICMP_TYPE_ECHOREQUEST 8
+    octet	code;
+    word	checksum;
+    word	ident;
+    word	seqnum;
+} icmp_header_t;
+
+
+typedef struct _pktbuf {
+    struct _pktbuf *next;
+#if 0
+    eth_header_t   *eth_hdr;		/* pointer to ethernet header */
+#endif
+    union {
+	ip_header_t *__iphdr;		/* pointer to IP header */
+	arp_header_t *__arphdr;		/* pointer to ARP header */
+    } u1;
+#define ip_hdr u1.__iphdr
+#define arp_hdr u1.__arphdr
+    union {
+	udp_header_t *__udphdr;		/* pointer to UDP header */
+	tcp_header_t *__tcphdr;		/* pointer to TCP header */
+	icmp_header_t *__icmphdr;	/* pointer to ICMP header */
+    } u2;
+#define udp_hdr u2.__udphdr
+#define tcp_hdr u2.__tcphdr
+#define icmp_hdr u2.__icmphdr
+    word	pkt_bytes;		/* number of data bytes in buf */
+    word        bufsize;                /* size of buf */
+    word	*buf;
+} pktbuf_t;
+
+
+/* protocol handler */
+typedef void (*pkt_handler_t)(pktbuf_t *pkt);
+
+
+typedef struct _udp_socket {
+    struct _udp_socket	*next;
+    word		our_port;
+    word		pad;
+    void                (*handler)(struct _udp_socket *skt, char *buf, int len,
+				   ip_route_t *src_route, word src_port);
+} udp_socket_t;
+
+
+typedef void (*udp_handler_t)(udp_socket_t *skt, char *buf, int len,
+			      ip_route_t *src_route, word src_port);
+
+
+typedef struct _tcp_socket {
+    struct _tcp_socket *next;
+    int		       state;       /* connection state */
+#define _CLOSED      0
+#define _LISTEN      1
+#define _SYN_RCVD    2
+#define _SYN_SENT    3
+#define _ESTABLISHED 4
+#define _CLOSE_WAIT  5
+#define _LAST_ACK    6
+#define _FIN_WAIT_1  7
+#define _FIN_WAIT_2  8
+#define _CLOSING     9
+#define _TIME_WAIT  10
+    ip_route_t         his_addr;    /* address of other end of connection */
+    word               our_port;
+    word               his_port;
+    word               data_bytes;   /* number of data bytes in pkt */
+    timer_t            timer;
+    pktbuf_t           pkt;         /* dedicated xmit packet */
+    pktbuf_t           *rxlist;     /* list of unread incoming data packets */
+    char               *rxptr;      /* pointer to next byte to read */
+    int                rxcnt;       /* bytes left in current read packet */
+    word               ack_pending; /* true if outgoing ack is deferred while
+				       awaiting incoming ack */
+    dword              ack;
+    dword              seq;
+    char               pktbuf[ETH_MAX_PKTLEN];
+} tcp_socket_t;
+
+/*
+ * Our address.
+ */
+extern enet_addr_t __local_enet_addr;
+extern ip_addr_t   __local_ip_addr;
+
+
+/*
+ * Set a timer. Caller is responsible for providing the timer_t struct.
+ */
+extern void __timer_set(timer_t *t, unsigned long delay,
+			tmr_handler_t handler, void *user_data);
+
+/*
+ * Cancel the given timer.
+ */
+extern void __timer_cancel(timer_t *t);
+
+/*
+ * Poll timer list for timer expirations.
+ */
+extern void __timer_poll(void);
+
+/*
+ * Initialize the free list.
+ */
+extern void __pktbuf_init(void);
+
+/*
+ * simple pktbuf allocation.
+ * allocates at least nbytes for packet data including ethernet header.
+ */
+extern pktbuf_t *__pktbuf_alloc(int nbytes);
+
+/*
+ * return a pktbuf for reuse.
+ */
+extern void __pktbuf_free(pktbuf_t *pkt);
+
+
+/*
+ * Install handlers for ethernet packets.
+ * Returns old handler.
+ */
+extern pkt_handler_t __eth_install_handler(int eth_type,
+					   pkt_handler_t handler);
+/*
+ * Set tcp port number for debugging. If not called, a default
+ * will be selected.
+ */
+extern void _bsp_net_set_debug_port(int portnum);
+
+/*
+ * Non-blocking poll of ethernet link. Processes at most
+ * one packet.
+ */
+extern void __enet_poll(void);
+
+/*
+ * Send an ethernet packet.
+ */
+extern void __enet_send(pktbuf_t *pkt, enet_addr_t *dest, int eth_type);
+
+
+/*
+ * Handle incoming ARP packets.
+ */
+extern void __arp_handler(pktbuf_t *pkt);
+
+/* 
+ * Find the ethernet address of the machine with the given
+ * ip address.
+ * Return true and fills in 'eth_addr' if successful, false
+ * if unsuccessful.
+ */
+extern int __arp_request(ip_addr_t *ip_addr, enet_addr_t *eth_addr);
+
+
+/*
+ * Do a one's complement checksum.
+ * The data being checksum'd is in network byte order.
+ * The returned checksum is in network byte order.
+ */
+extern unsigned short __sum(word *w, int len, int init_sum);
+
+/*
+ * Compute a partial checksum for the UDP/TCP pseudo header.
+ */
+extern int __pseudo_sum(ip_header_t *ip);
+
+/*
+ * Handle IP packets coming from the polled ethernet interface.
+ */
+extern void __ip_handler(pktbuf_t *pkt, enet_addr_t *src_enet_addr);
+
+/*
+ * Send an IP packet.
+ *
+ * The IP data field should contain pkt->pkt_bytes of data.
+ * pkt->[udp|tcp|icmp]_hdr points to the IP data field. Any
+ * IP options are assumed to be already in place in the IP
+ * options field.
+ */
+extern void __ip_send(pktbuf_t *pkt, int protocol, ip_route_t *dest);
+
+
+/*
+ * Handle incoming ICMP packets.
+ */
+extern void __icmp_handler(pktbuf_t *pkt, ip_route_t *r);
+
+/*
+ * Handle incoming UDP packets.
+ */
+extern void __udp_handler(pktbuf_t *pkt, ip_route_t *r);
+
+/*
+ * Install a handler for incoming udp packets.
+ * Caller provides the udp_socket_t structure.
+ * Returns zero if successful, -1 if socket is already used.
+ */
+extern int __udp_install_listener(udp_socket_t *s, word port,
+				  udp_handler_t handler);
+
+/*
+ * Remove the handler for the given socket.
+ */
+extern void __udp_remove_listener(word port);
+
+/*
+ * Send a UDP packet.
+ */
+extern void __udp_send(char *buf, int len, ip_route_t *dest_ip,
+		       word dest_port, word src_port);
+
+// Send a UDP packet
+extern int __udp_sendto(char *buf, int len, 
+                        struct sockaddr_in *server, struct sockaddr_in *local);
+
+// Receive a UDP packet
+extern int __udp_recvfrom(char *buf, int len, 
+                          struct sockaddr_in *from, struct sockaddr_in *local,
+                          struct timeval *timeout);
+
+/*
+ * TCP poll function. Should be called as often as possible.
+ */
+extern void __tcp_poll(void);
+
+/*
+ * Set up a listening socket on the given port.
+ * Does not block.
+ */
+extern int __tcp_listen(tcp_socket_t *s, word port);
+
+
+/*
+ * Block while waiting for all outstanding socket data to
+ * be transmitted.
+ */
+extern void __tcp_drain(tcp_socket_t *s);
+
+
+/*
+ * Initiate connection close.
+ */
+extern void __tcp_close(tcp_socket_t *s);
+
+/*
+ * Wait until connection has fully closed.
+ */
+extern void __tcp_close_wait(tcp_socket_t *s);
+
+/*
+ * Read up to 'len' bytes without blocking.
+ * Returns number of bytes read.
+ * If connection is closed, returns -1.
+ */
+extern int __tcp_read(tcp_socket_t *s, char *buf, int len);
+
+/*
+ * Write up to 'len' bytes without blocking.
+ * Returns number of bytes written.
+ * If connection is closed, returns -1.
+ */
+extern int __tcp_write(tcp_socket_t *s, char *buf, int len);
+
+
+/*
+ * The following are a higher-level tcp socket interface.
+ */
+
+/*
+ * Initialize a socket for given port.
+ */
+extern void __skt_init(tcp_socket_t *s, unsigned short port);
+
+/*
+ * Return true if socket connection is closed.
+ */
+#define __skt_is_closed(s) (((tcp_socket_t *)(s))->state == _CLOSED)
+
+/*
+ * Block while listening for an incoming connection.
+ */
+extern void __skt_wait_for_connect(tcp_socket_t *s);
+
+/*
+ * Read up to 'len' bytes from the given socket.
+ * Returns number of bytes read.
+ * Doesn't block.
+ */
+extern int __skt_read(tcp_socket_t *s, char *buf, int len);
+
+/*
+ * Write 'len' bytes to the given socket.
+ * Returns number of bytes written.
+ * May not write all data if connection closes.
+ */
+extern int __skt_write(tcp_socket_t *s, char *buf, int len);
+
+// Initialize the network stack - logical driver layer, etc.
+extern void net_init(void);
+
+// Test for new network I/O connections
+extern void net_io_test(void);
+
+// Conversion between IP addresses and printable strings
+extern bool  inet_aton(char *, in_addr_t *);
+extern char *inet_ntoa(in_addr_t *);
+
+// FIXME
+/* #define NET_SUPPORT_RARP  1 */
+#define NET_SUPPORT_ICMP 1
+#define NET_SUPPORT_UDP  1
+#define NET_SUPPORT_TCP  1
+
+#ifdef BSP_LOG
+#define BSPLOG(x) { start_console(); x; end_console(); }
+#define bsp_log printf
+#else
+#define BSPLOG(x)
+#endif
+
+#endif // _NET_H_