📄 net.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, 2001 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);
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 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;
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,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -