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

📄 pcsed.h

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 H
字号:
/*
 * Link-layer (DIX Ethernet, Token-Ring, FDDI and PPP/SLIP) Interface
 */

#ifndef __PCSED_H
#define __PCSED_H

/*
 * Hardware (MAC) address numbers (host order)
 */
#define HW_TYPE_ETHER     1
#define HW_TYPE_TOKEN     6
#define HW_TYPE_ARCNET    7
#define HW_TYPE_APPLETALK 8
#define HW_TYPE_FDDI      9   /* correct? */

#include <sys/packon.h>  /* align structs on byte boundaries */

/*
 * The Ethernet header
 */
typedef struct eth_Header {
        eth_address  destination;
        eth_address  source;
        WORD         type;
      } eth_Header;

typedef struct eth_Packet {
        eth_Header   head;
        BYTE         data [ETH_MAX_DATA];
      } eth_Packet;

/*
 * Token-Ring header, refer RFC-1042, pg. 8
 */
typedef struct tok_Header {
        /* MAC header
         */
        BYTE        accessCtrl;
        BYTE        frameCtrl;
        mac_address destination;
        mac_address source;

        /* 2-18 bytes of Routing Information (RIF) may be present here.
         * We discard it anyway (see _eth_fix_tok_head).
         */

        /* LLC header
         */
        BYTE        DSAP;
        BYTE        SSAP;
        BYTE        ctrl;

        /* SNAP extension
         */
        BYTE        org[3];
        WORD        type;
      } tok_Header;

typedef struct tok_Packet {
        tok_Header head;
        BYTE       data [TOK_MAX_DATA];
      } tok_Packet;

/*
 * From Xinu, tr.h
 */
#define TR_AC       0x10    /* Access Control; Frame bit (not token) */
#define TR_FC       0x40    /* Frame Control;  LLC header follows */
#define TR_DSAP     0xAA    /* DSAP field; SNAP follows LLC */
#define TR_SSAP     0xAA    /* SSAP field; SNAP follows LLC */
#define TR_CTRL     0x03    /* Unnumbered Information */
#define TR_ORG      0x00    /* Organisation Code or Protocol Id */


/*
 * The FDDI header
 */
typedef struct fddi_Header {
        BYTE        frameCtrl;
        eth_address destination;
        eth_address source;
        BYTE        DSAP;
        BYTE        SSAP;
        BYTE        ctrl;
        BYTE        org[3];
        WORD        type;
      } fddi_Header;

typedef struct fddi_Packet {
        fddi_Header head;
        BYTE        data [FDDI_MAX_DATA];
      } fddi_Packet;

#define FDDI_FC     0x40   /* See above */
#define FDDI_DSAP   0xAA
#define FDDI_SSAP   0xAA
#define FDDI_CTRL   0x03
#define FDDI_ORG    0x00

/*
 * The PPPOE header (RFC-2561)
 */
typedef struct pppoe_Header {
        eth_address  destination;
        eth_address  source;
        WORD         proto;
        BYTE         ver  : 4;
        BYTE         type : 4;
        BYTE         code;
        WORD         session;
        WORD         length;
      } pppoe_Header;

typedef struct pppoe_Packet {
        pppoe_Header head;
        BYTE         data [PPPOE_MAX_DATA];
      } pppoe_Packet;


/*
 * The union of all above MAC-headers
 */
typedef union link_Packet {
        struct eth_Packet   eth;    /* _pktdevclass = PD_ETHER */
        struct tok_Packet   tok;    /* _pktdevclass = PD_TOKEN */
        struct fddi_Packet  fddi;   /* _pktdevclass = PD_FDDI  */
        struct ip_Packet    ip;     /* _pktdevclass = PD_PPP/PP_SLIP */
        struct pppoe_Packet pppoe;  /* _pktdevclass = PD_ETHER */
      } link_Packet;

#include <sys/packoff.h>           /* restore default packing */


extern BOOL        _ip_recursion;
extern BOOL        _eth_is_init;
extern mac_address _eth_addr;
extern mac_address _eth_brdcast;
extern mac_address _eth_loop_addr;

extern void *(*_eth_recv_hook) (WORD *type);
extern int   (*_eth_xmit_hook) (void *buf, unsigned len);

extern int   _eth_init         (void);
extern void  _eth_release      (void);
extern int   _eth_send         (WORD len);
extern int   _eth_set_addr     (mac_address *addr);
extern BYTE *_eth_formatpacket (const void *mac_dest, WORD mac_type);
extern void  _eth_free         (const void *pkt, WORD mac_type);
extern void *_eth_arrived      (WORD *type, BOOL *brdcast);
extern void *_eth_hardware     (BYTE *p);
extern BYTE  _eth_get_hwtype   (BYTE *hwtype, BYTE *hwlen);

#if defined(USE_MULTICAST)
  extern int _eth_join_mcast_group  (int entry);
  extern int _eth_leave_mcast_group (int entry);
#endif

#if defined(USE_LOOPBACK)
  extern int _eth_send_loopback (union link_Packet);
#endif

/*
 * Return pointer to hardware source address of
 * an IP packet. For Ethernet:
 *
 *     struct eth_Packet {
 *      -14-> BYTE  dest [6];
 *       -8-> BYTE  src  [6];
 *            WORD  type;
 *       ip-> BYTE  data [1500];
 *          };
 *
 * For Token-Ring:
 *     struct tok_Packet {
 *      -22-> BYTE  AC, FC;
 *            BYTE  dest [6];
 *      -14-> BYTE  src  [6];
 *            BYTE  DSAP, SSAP, ctrl;
 *            BYTE  org [3];
 *            WORD  type;
 *       ip-> BYTE  data [1500];
 *
 * These macros and function should never be called for serial protocols
 * except that it doesn't hurt to use MAC_SRC() for all driver classes.
 */

#if defined(USE_DEBUG) && 0  /* slower, but safer method */
  extern void *_eth_mac_hdr (const in_Header *ip);
  extern void *_eth_mac_src (const in_Header *ip);
  extern WORD  _eth_mac_typ (const in_Header *ip);

  #define MAC_HDR(ip) _eth_mac_hdr(ip)
  #define MAC_SRC(ip) _eth_mac_src(ip)
  #define MAC_TYP(ip) _eth_mac_typ(ip)
#else
  #define MAC_HDR(ip) (void*) ((BYTE*)(ip) - _pkt_ip_ofs)

  #define MAC_SRC(ip) (void*) ((BYTE*)(ip) -             \
                        (_pktdevclass == PD_TOKEN ? 14 : \
                         _pktdevclass == PD_FDDI  ? 14 : 8))

  #define MAC_TYP(ip) (*(WORD*) ((BYTE*)(ip) - 2))
#endif

/*
 * Macros to insert or clear peer's source MAC-address stored in
 * the tcp_Socket.
 * Only used on passive (listening) udp/tcp sockets.
 * We don't use arp_resolve() because of reentrancy problems;
 * If inbound packets come from a different gateway than outbound
 * packets, then this macro fails.
 */
#define SET_PEER_MAC_ADDR(tcb,ip) do {                    \
          if (!_pktserial)                                \
             memcpy (&(tcb)->hisethaddr[0],MAC_SRC(ip),6);\
        } while (0)

#define CLR_PEER_MAC_ADDR(tcb) do {             \
          if (!_pktserial)                      \
             memset (&(tcb)->hisethaddr[0],0,6);\
        } while (0)

#endif

⌨️ 快捷键说明

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