531 lines
28 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*********************************************************************************************************
* uC/TCP-IP
* The Embedded TCP/IP Suite
*
* (c) Copyright 2003-2006; Micrium, Inc.; Weston, FL
*
* All rights reserved. Protected by international copyright laws.
* Knowledge of the source code may not be used to write a similar
* product. This file may only be used in accordance with a license
* and should not be redistributed in any way.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* NETWORK INTERFACE LAYER
*
* ETHERNET
*
* Filename : net_if.h
* Version : V1.86
* Programmer(s) : ITJ
*********************************************************************************************************
* Note(s) : (1) Supports Ethernet as described in RFC #894; supports IEEE 802 as described in RFC #1042.
*
* (2) Ethernet implementation conforms to RFC #1122, Section 2.3.3, bullets (a) & (b), but
* does NOT implement bullet (c) :
*
* RFC #1122 LINK LAYER October 1989
*
* 2.3.3 ETHERNET (RFC-894) and IEEE 802 (RFC-1042) ENCAPSULATION
*
* Every Internet host connected to a 10Mbps Ethernet cable :
*
* (a) MUST be able to send and receive packets using RFC-894 encapsulation;
*
* (b) SHOULD be able to receive RFC-1042 packets, intermixed with RFC-894 packets; and
*
* (c) MAY be able to send packets using RFC-1042 encapsulation.
*
* (3) REQUIREs the following network protocol files in network directories :
*
* where
* <Network Protocol Suite> directory path for network protocol suite
*
* (a) Packet-based Network Interface Layer located in the following network directory :
*
* \<Network Protocol Suite>\IF\
*
* (b) Address Resolution Protocol Layer located in the following network directory :
*
* \<Network Protocol Suite>\
*
* See also 'net_arp.h Note #1'.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#include <net_if_pkt.h> /* See 'net_if.h Note #3a'. */
#include <net_arp.h> /* See 'net_if.h Note #3b'. */
/*
*********************************************************************************************************
* MODULE
*********************************************************************************************************
*/
#define NET_IF_MODULE_ETHERNET
/*
*********************************************************************************************************
* EXTERNS
*********************************************************************************************************
*/
#ifdef NET_IF_MODULE
#define NET_IF_EXT
#else
#define NET_IF_EXT extern
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* DEFINES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NETWORK INTERFACE / ETHERNET DEFINES
*********************************************************************************************************
*/
#define NET_IF_ADDR_MAC_PRESENT
#define NET_IF_ADDR_SIZE 6 /* 48-bit MAC/net addr size. */
#define NET_IF_ADDR_SIZE_MAC NET_IF_ADDR_SIZE
#define NET_IF_ADDR_BROADCAST 0xFFFFFFFFFFFF
#define NET_IF_ADDR_BROADCAST_xx 0xFF /* ALL broadcast addr octet vals identical. */
#define NET_IF_ADDR_BROADCAST_00 0xFF
#define NET_IF_ADDR_BROADCAST_01 0xFF
#define NET_IF_ADDR_BROADCAST_02 0xFF
#define NET_IF_ADDR_BROADCAST_03 0xFF
#define NET_IF_ADDR_BROADCAST_04 0xFF
#define NET_IF_ADDR_BROADCAST_05 0xFF
/*
*********************************************************************************************************
* NETWORK INTERFACE LAYER / ETHERNET ERROR CODES
*
* Note(s) : (1) ALL IF-independent error codes #define'd in 'net_err.h';
* ALL Ethernet-specific error codes #define'd in this 'net_if.h'.
*
* (2) Network error code '11,000' series reserved for network interfaces.
*********************************************************************************************************
*/
#define NET_IF_ERR_INVALID_MAC 11400 /* Invalid MAC addr. */
#define NET_IF_ERR_INVALID_PROTOCOL 11410 /* Invalid protocol. */
#define NET_IF_ERR_INVALID_ETHER_TYPE 11411 /* Invalid Ethernet type. */
#define NET_IF_ERR_INVALID_LLC_DSAP 11420 /* Invalid IEEE 802.2 LLC DSAP val. */
#define NET_IF_ERR_INVALID_LLC_SSAP 11421 /* Invalid IEEE 802.2 LLC SSAP val. */
#define NET_IF_ERR_INVALID_LLC_CTRL 11422 /* Invalid IEEE 802.2 LLC Ctrl val. */
#define NET_IF_ERR_INVALID_SNAP_CODE 11430 /* Invalid IEEE 802.2 SNAP OUI val. */
#define NET_IF_ERR_INVALID_SNAP_TYPE 11431 /* Invalid IEEE 802.2 SNAP Type val. */
#define NET_IF_ERR_TX_BROADCAST 11600 /* Tx broadcast on local net. */
#define NET_IF_ERR_TX_ARP 11601 /* Tx requires ARP hw addr binding. */
/*$PAGE*/
/*
*********************************************************************************************************
* NETWORK INTERFACE HEADER DEFINES
*
* Note(s) : (1) NET_IF_HDR_SIZE_MAX's ideal #define'tion :
*
* (A) max( Ether Hdr, IEEE 802 Hdr)
*
* (a) However, since NET_IF_HDR_SIZE_MAX is used ONLY for network transmit & IEEE 802 is
* NEVER transmitted (see 'net_if.h Note #2'), NET_IF_HDR_SIZE_MAX MUST be #define'd
* with hard-coded knowledge that Ethernet is the only supported frame encapsulation
* for network transmit.
*
* (b) The following network interface values MUST be pre-#define'd in 'net_def.h' PRIOR to
* 'net_cfg.h' so that the developer can configure the network interface for the correct
* network interface link layer values (see 'net_def.h NETWORK INTERFACE LAYER DEFINES'
* & 'net_cfg_net.h NETWORK INTERFACE LAYER CONFIGURATION') :
*
* (1) NET_IF_HDR_SIZE_ETHER 14
* (2) NET_IF_HDR_SIZE_MAX NET_IF_HDR_SIZE_ETHER
*********************************************************************************************************
*/
#define NET_IF_HDR_SIZE_BASE_ETHER 14 /* Ethernet base hdr size. */
#define NET_IF_HDR_SIZE_BASE_IEEE_802 8 /* IEEE 802 base hdr size. */
#if 0 /* See Note #1b1. */
#define NET_IF_HDR_SIZE_ETHER NET_IF_HDR_SIZE_BASE_ETHER
#endif
#define NET_IF_HDR_SIZE_IEEE_802 (NET_IF_HDR_SIZE_BASE_ETHER + NET_IF_HDR_SIZE_BASE_IEEE_802)
#define NET_IF_HDR_SIZE_MIN (DEF_MIN(NET_IF_HDR_SIZE_ETHER, NET_IF_HDR_SIZE_IEEE_802))
#if 0 /* See Notes #1a & #1b2. */
#define NET_IF_HDR_SIZE_MAX NET_IF_HDR_SIZE_ETHER
#endif
/* See Note #1a. */
#define NET_IF_HDR_SIZE_TOT_MIN NET_IF_HDR_SIZE_ETHER
#define NET_IF_HDR_SIZE_TOT_MAX NET_IF_HDR_SIZE_ETHER
#define NET_IF_HDR_SIZE_ADDR NET_IF_ADDR_SIZE
/*$PAGE*/
/*
*********************************************************************************************************
* NETWORK INTERFACE TOTAL LENGTH & MAXIMUM TRANSMISSION UNIT (MTU) DEFINES
*
* Note(s) : (1) NET_IF_MTU's ideal #define'tion :
*
* (A) min( Ether MTU, IEEE 802 MTU)
*
* (a) However, since NET_IF_MTU is used by higher network protocol layers ONLY for network
* transmit & IEEE 802 is NEVER transmitted (see 'net_if.h Note #2'), NET_IF_MTU MUST
* be #define'd with hard-coded knowledge that Ethernet is the only supported encapsulation
* for network interface transmit.
*
* (2) Ethernet & IEEE 802 minimum frame size is 64 octets (see RFC #894, Section 'Frame Format'
* & RFC #1042, Section 'Frame Format and MAC Level Issues : For IEEE 802.3'). However, the
* 4-octet CRC trailer is included in this 64 octet minimum frame size. Therefore, the minimum
* size for receive & transmit packets is adjusted by the CRC size.
*
* (3) Since network data value macro's appropriately convert data values from any CPU addresses,
* word-aligned or not; network receive & transmit packets are NOT required to ensure that
* network packet headers (ARP/IP/UDP/TCP/etc.) & header members will locate on CPU word-
* aligned addresses. Therefore, network interface frame packets are NOT required to start
* on any specific buffer indices.
*
* See also 'net_util.h NETWORK DATA VALUE MACRO'S Note #2b'
* & 'net_buf.h NETWORK BUFFER INDEX & SIZE DEFINES Note #2'.
*********************************************************************************************************
*/
#define NET_IF_MTU_ETHER 1500
#define NET_IF_MTU_IEEE_802 1492
/* See Note #1. */
#define NET_IF_MTU_MIN (DEF_MIN(NET_IF_MTU_ETHER, NET_IF_MTU_IEEE_802))
#define NET_IF_MTU_MAX (DEF_MAX(NET_IF_MTU_ETHER, NET_IF_MTU_IEEE_802))
#define NET_IF_MTU NET_IF_MTU_ETHER
#define NET_IF_FRAME_HDR_SIZE NET_IF_HDR_SIZE_ETHER
#define NET_IF_FRAME_HDR_SIZE_ETHER NET_IF_HDR_SIZE_ETHER
#define NET_IF_FRAME_HDR_SIZE_IEEE_802 NET_IF_HDR_SIZE_IEEE_802
#define NET_IF_FRAME_CRC_SIZE 4
#define NET_IF_FRAME_MIN_CRC_SIZE 64 /* See Note #2. */
#define NET_IF_FRAME_MIN_SIZE (NET_IF_FRAME_MIN_CRC_SIZE - NET_IF_FRAME_CRC_SIZE)
#define NET_IF_FRAME_MAX_SIZE (NET_IF_MTU + NET_IF_HDR_SIZE_MAX )
#define NET_IF_FRAME_MAX_CRC_SIZE (NET_IF_FRAME_MAX_SIZE + NET_IF_FRAME_CRC_SIZE)
#define NET_IF_PKT_SIZE_MIN NET_IF_FRAME_MIN_SIZE
#define NET_IF_PKT_SIZE_MAX NET_IF_FRAME_MAX_SIZE
/* See Note #3. */
#define NET_IF_RX_IX NET_BUF_DATA_RX_IX
/*$PAGE*/
/*
*********************************************************************************************************
* ETHERNET DEFINES
*********************************************************************************************************
*/
/* ---------------- ETHER FRAME TYPES ----------------- */
#define NET_IF_FRAME_ETHER_TYPE_IP 0x0800
#define NET_IF_FRAME_ETHER_TYPE_ARP 0x0806
#define NET_IF_FRAME_ETHER_TYPE_RARP 0x8035 /* See 'net_def.h NETWORK PROTOCOL TYPES Note #1'. */
/*
*********************************************************************************************************
* IEEE 802 DEFINES
*
* Note(s) : (1) SNAP 'Organizational Unique Identifier' (OUI) abbreviated to 'SNAP' for some SNAP OUI
* codes to enforce ANSI-compliance of 31-character symbol length uniqueness.
*
* (2) Default SNAP 'Organizational Unique Identifier' (OUI) IEEE 802.2 frame type is ALWAYS
* Ethernet frame type (see 'IEEE 802 HEADER / FRAME Note #1').
*********************************************************************************************************
*/
#define NET_IF_IEEE_802_FRAME_LEN_MAX (NET_IF_MTU_IEEE_802 + NET_IF_HDR_SIZE_BASE_IEEE_802)
/* ------- IEEE 802.2 LOGICAL LINK CONTROL (LLC) ------ */
#define NET_IF_IEEE_802_LLC_DSAP 0xAA
#define NET_IF_IEEE_802_LLC_SSAP 0xAA
#define NET_IF_IEEE_802_LLC_CTRL 0x03
/* --- IEEE 802.2 SUB-NETWORK ACCESS PROTOCOL (SNAP) -- */
#define NET_IF_IEEE_802_SNAP_CODE_SIZE 3 /* 3-octet SNAP org code (see Note #1). */
#define NET_IF_IEEE_802_SNAP_CODE_ETHER 0x000000 /* Dflt SNAP org code (Ether) [see Note #2]. */
#define NET_IF_IEEE_802_SNAP_CODE_00 0x00 /* Dflt SNAP org code, Octet #00. */
#define NET_IF_IEEE_802_SNAP_CODE_01 0x00 /* Dflt SNAP org code, Octet #01. */
#define NET_IF_IEEE_802_SNAP_CODE_02 0x00 /* Dflt SNAP org code, Octet #02. */
#define NET_IF_IEEE_802_SNAP_TYPE_IP NET_IF_FRAME_ETHER_TYPE_IP
#define NET_IF_IEEE_802_SNAP_TYPE_ARP NET_IF_FRAME_ETHER_TYPE_ARP
/*$PAGE*/
/*
*********************************************************************************************************
* DATA TYPES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NETWORK INTERFACE HEADER / FRAME DATA TYPES
*********************************************************************************************************
*/
/* ---------------------- NET IF HDR ---------------------- */
typedef struct net_if_hdr {
CPU_INT08U AddrDest[NET_IF_HDR_SIZE_ADDR]; /* Ethernet dest addr. */
CPU_INT08U AddrSrc[NET_IF_HDR_SIZE_ADDR]; /* Ethernet src addr. */
CPU_INT16U FrameType_Len; /* Demux Ethernet frame type vs. IEEE 802.3 frame len. */
} NET_IF_HDR;
/*
*********************************************************************************************************
* ETHERNET HEADER / FRAME DATA TYPES
*
* Note(s) : (1) Frame 'Data' buffer CANNOT be declared to force word-alignment. 'Data' buffer MUST immediately
* follow frame 'Hdr' since Ethernet frames are contiguous, non-aligned data packets.
*
* (2) 'Data' declared with 1 entry; prevents removal by compiler optimization.
*
* (3) Frame CRC's are computed/validated by NIC. NO software CRC is handled for receive or transmit.
*********************************************************************************************************
*/
/* ------------------ NET IF ETHER HDR -------------------- */
typedef struct net_if_hdr_ether {
CPU_INT08U AddrDest[NET_IF_HDR_SIZE_ADDR]; /* Ethernet dest addr. */
CPU_INT08U AddrSrc[NET_IF_HDR_SIZE_ADDR]; /* Ethernet src addr. */
CPU_INT16U FrameType; /* Ethernet frame type. */
} NET_IF_HDR_ETHER;
/* ------------------ NET IF ETHER FRAME ------------------ */
typedef struct net_if_frame_ether {
NET_IF_HDR_ETHER Hdr;
CPU_INT08U Data[1]; /* See Note #2. */
} NET_IF_FRAME_ETHER;
/*$PAGE*/
/*
*********************************************************************************************************
* IEEE 802 HEADER / FRAME DATA TYPES
*
* Note(s) : (1) Header 'SNAP_OrgCode' defines the SNAP 'Organizational Unique Identifier' (OUI). The OUI
* indicates the various organization/vendor/manufacturer with each organization then defining
* their respective frame types.
*
* However, the default SNAP OUI indicates Ethernet frame types & is ALWAYS used. ALL other
* OUI's are discarded as invalid.
*
* See also 'IEEE 802 DEFINES Notes #1 & #2'.
*
* (2) Frame 'Data' buffer CANNOT be declared to force word-alignment. 'Data' buffer MUST immediately
* follow frame 'Hdr' since Ethernet frames are contiguous, non-aligned data packets.
*
* (3) 'Data' declared with 1 entry; prevents removal by compiler optimization.
*
* (4) Frame CRC's are computed/validated by NIC. NO software CRC is handled for receive or transmit.
*********************************************************************************************************
*/
/* ------------------ NET IF IEEE 802 HDR ----------------- */
typedef struct net_if_hdr_ieee_802 {
CPU_INT08U AddrDest[NET_IF_HDR_SIZE_ADDR]; /* IEEE 802.3 dest addr. */
CPU_INT08U AddrSrc[NET_IF_HDR_SIZE_ADDR]; /* IEEE 802.3 src addr. */
CPU_INT16U FrameLen; /* IEEE 802.3 frame len. */
/* --------- IEEE 802.2 LOGICAL LINK CONTROL (LLC) -------- */
CPU_INT08U LLC_DSAP; /* Dest Serv Access Pt. */
CPU_INT08U LLC_SSAP; /* Src Serv Access Pt. */
CPU_INT08U LLC_Ctrl; /* Ctrl Field. */
/* ----- IEEE 802.2 SUB-NETWORK ACCESS PROTOCOL (SNAP) ---- */
CPU_INT08U SNAP_OrgCode[NET_IF_IEEE_802_SNAP_CODE_SIZE]; /* Org code (see Note #1). */
CPU_INT16U SNAP_FrameType; /* IEEE 802.2 frame type. */
} NET_IF_HDR_IEEE_802;
/* ----------------- NET IF IEEE 802 FRAME ---------------- */
typedef struct net_if_frame_ieee_802 {
NET_IF_HDR_IEEE_802 Hdr;
CPU_INT08U Data[1]; /* See Note #3. */
} NET_IF_FRAME_IEEE_802;
/*$PAGE*/
/*
*********************************************************************************************************
* GLOBAL VARIABLES
*********************************************************************************************************
*/
NET_IF_EXT CPU_INT08U NetIF_MAC_Addr[NET_IF_ADDR_SIZE]; /* NIC's MAC addr. */
NET_IF_EXT CPU_BOOLEAN NetIF_MAC_AddrValid; /* Indicates if valid NIC MAC addr avail. */
#if (NET_CTR_CFG_STAT_EN == DEF_ENABLED) /* ------------------- NET IF STATS ------------------- */
NET_IF_EXT NET_CTR NetIF_StatRxPktCtr; /* Nbr rx'd pkts. */
NET_IF_EXT NET_CTR NetIF_StatRxPktProcessedCtr; /* Nbr rx'd pkts delivered to supported protocols. */
NET_IF_EXT NET_CTR NetIF_StatRxPktBroadcastCtr; /* Nbr rx'd pkts broadcast to this dest. */
NET_IF_EXT NET_CTR NetIF_StatTxPktCtr; /* Nbr tx'd pkts. */
NET_IF_EXT NET_CTR NetIF_StatTxPktBroadcastCtr; /* Nbr rx'd pkts broadcast to multiple dest(s). */
#endif
#if (NET_CTR_CFG_ERR_EN == DEF_ENABLED) /* ------------------- NET IF ERRS -------------------- */
NET_IF_EXT NET_CTR NetIF_ErrNullPtrCtr; /* Nbr null IF ptr accesses. */
NET_IF_EXT NET_CTR NetIF_ErrInvalidProtocolCtr;
NET_IF_EXT NET_CTR NetIF_ErrRxInvalidFrameCtr; /* Nbr rx'd pkts with invalid frame. */
NET_IF_EXT NET_CTR NetIF_ErrRxInvalidAddrDestCtr; /* Nbr rx'd pkts with invalid dest addr. */
NET_IF_EXT NET_CTR NetIF_ErrRxInvalidAddrSrcCtr; /* Nbr rx'd pkts with invalid src addr. */
NET_IF_EXT NET_CTR NetIF_ErrRxPktDiscardedCtr; /* Nbr rx'd pkts discarded. */
NET_IF_EXT NET_CTR NetIF_ErrTxInvalidBufLenCtr;
NET_IF_EXT NET_CTR NetIF_ErrTxPktDiscardedCtr; /* Nbr tx pkts discarded. */
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
NET_IF_EXT NET_CTR NetIF_ErrRxInvalidBufIxCtr; /* Nbr rx pkts with invalid buf ix. */
NET_IF_EXT NET_CTR NetIF_ErrTxProtocolCtr;
NET_IF_EXT NET_CTR NetIF_ErrTxInvalidBufIxCtr; /* Nbr tx pkts with invalid buf ix. */
NET_IF_EXT NET_CTR NetIF_ErrTxHdrDataLenCtr;
#endif
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void NetIF_Init (NET_ERR *perr);
/* ------------------- STATUS FNCTS ------------------- */
void NetIF_MAC_AddrGet (CPU_INT08U *paddr,
NET_ERR *perr);
void NetIF_MAC_AddrSet (CPU_INT08U *paddr,
NET_ERR *perr);
CPU_BOOLEAN NetIF_IsValidPktSize(CPU_INT16U size); /* Validate an IF pkt size. */
CPU_BOOLEAN NetIF_IsValidAddrSrc(CPU_INT08U *paddr_src); /* Validate an IF src addr. */
/* --------------------- RX FNCTS --------------------- */
void NetIF_Rx (NET_BUF *pbuf,
NET_ERR *perr);
/* --------------------- TX FNCTS --------------------- */
void NetIF_Tx (NET_BUF *pbuf,
NET_ERR *perr);
void NetIF_TxPkt (NET_BUF *pbuf,
NET_ERR *perr);
void NetIF_TxPktDiscard (NET_BUF *pbuf,
NET_ERR *perr);
/*$PAGE*/
/*
*********************************************************************************************************
* CONFIGURATION ERRORS
*********************************************************************************************************
*/
#ifndef NET_IF_CFG_TYPE
#error "NET_IF_CFG_TYPE not #define'd in 'net_cfg.h'"
#error " [MUST be NET_IF_TYPE_ETHER] "
#elif (NET_IF_CFG_TYPE != NET_IF_TYPE_ETHER)
#error "NET_IF_CFG_TYPE illegally #define'd in 'net_cfg.h'"
#error " [MUST be NET_IF_TYPE_ETHER] "
#else
/* Correctly configured in 'net_cfg_net.h'; DO NOT MODIFY. */
#ifndef NET_IF_HDR_SIZE_MAX
#error "NET_IF_HDR_SIZE_MAX not #define'd in 'net_cfg_net.h' "
#error " [NET_IF_HDR_SIZE_MAX MUST be > 0]"
#elif (NET_IF_HDR_SIZE_MAX < 1)
#error "NET_IF_HDR_SIZE_MAX illegally #define'd in 'net_cfg_net.h' "
#error " [NET_IF_HDR_SIZE_MAX MUST be > 0]"
#endif
#endif
/* Correctly configured in this 'net_if.h'; DO NOT MODIFY. */
#ifndef NET_IF_FRAME_MIN_SIZE
#error "NET_IF_FRAME_MIN_SIZE not #define'd in 'net_if.h' "
#error " [NET_IF_FRAME_MIN_SIZE MUST be > ]"
#error " [NET_IF_HDR_SIZE_MAX ]"
#elif (NET_IF_FRAME_MIN_SIZE < NET_IF_HDR_SIZE_MAX)
#error "NET_IF_FRAME_MIN_SIZE illegally #define'd in 'net_if.h' "
#error " [NET_IF_FRAME_MIN_SIZE MUST be > ]"
#error " [NET_IF_HDR_SIZE_MAX ]"
#endif
#ifndef NET_IF_CFG_ADDR_FLTR_EN
#error "NET_IF_CFG_ADDR_FLTR_EN not #define'd in 'net_cfg.h'"
#error " [MUST be DEF_DISABLED] "
#error " [ || DEF_ENABLED ] "
#elif ((NET_IF_CFG_ADDR_FLTR_EN != DEF_DISABLED) && \
(NET_IF_CFG_ADDR_FLTR_EN != DEF_ENABLED ))
#error "NET_IF_CFG_ADDR_FLTR_EN illegally #define'd in 'net_cfg.h'"
#error " [MUST be DEF_DISABLED] "
#error " [ || DEF_ENABLED ] "
#endif