⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net.h

📁 移植到WLIT项目的redboot源代码
💻 H
字号:
//==========================================================================////      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__#endifextern 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  1514typedef 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 supporttypedef struct in_addr {    unsigned long  s_addr;  // IPv4 address} in_addr_t;// Socket/connection informationstruct 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   0struct 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);/* * Dump packet structures (debug, in case of running out) */extern void __pktbuf_dump(void);/* * 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);/* * Lookup an address from the local ARP cache.  If not found, * then call 'arp_request' to find it.  [Basically just a cached * version of 'arp_request'] */extern int __arp_lookup(ip_addr_t *host, ip_route_t *rt);/* * 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 packetextern int __udp_sendto(char *buf, int len,                         struct sockaddr_in *server, struct sockaddr_in *local);// Receive a UDP packetextern 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 connectionsextern void net_io_test(void);// Conversion between IP addresses and printable stringsextern 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//#define BSP_LOG#ifdef BSP_LOG#define BSPLOG(x) { int oldConsole = start_console(); x; end_console(oldConsole); }#define bsp_log printf#else#define BSPLOG(x)	;#endif#endif // _NET_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -