📄 net.h
字号:
//==========================================================================
//
// net/net.h
//
// Stand-alone networking support for RedBoot
//
//==========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
// Copyright (C) 2002 Gary Thomas
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//==========================================================================
//#####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/system.h>
#include <pkgconf/redboot.h>
#include <cyg/hal/hal_arch.h>
#include <cyg/hal/basetype.h>
#include <string.h>
extern bool net_debug;
#ifdef CYGPKG_IO_ETH_DRIVERS
# include <pkgconf/io_eth_drivers.h>
# ifdef CYGDBG_IO_ETH_DRIVERS_DEBUG
extern int cyg_io_eth_net_debug;
# endif
#endif
extern unsigned long do_ms_tick(void);
extern unsigned long get_ms_ticks(void);
#define MS_TICKS() get_ms_ticks()
#define MS_TICKS_DELAY() 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 (1540-14)
#define ETH_HDR_SIZE 14
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) + ETH_HDR_SIZE)
/*
* 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 + ETH_HDR_SIZE)
/*
* 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;
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, eth_header_t *eth_hdr);
/* ICMP fielder */
typedef void (*icmp_handler_t)(pktbuf_t *pkt, ip_route_t *src_route);
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -