1*53ee8cc1Swenshuai.xi /* 2*53ee8cc1Swenshuai.xi * INET An implementation of the TCP/IP protocol suite for the LINUX 3*53ee8cc1Swenshuai.xi * operating system. INET is implemented using the BSD Socket 4*53ee8cc1Swenshuai.xi * interface as the means of communication with the user level. 5*53ee8cc1Swenshuai.xi * 6*53ee8cc1Swenshuai.xi * Global definitions for the HIPPI interface. 7*53ee8cc1Swenshuai.xi * 8*53ee8cc1Swenshuai.xi * Version: @(#)if_hippi.h 1.0.0 05/26/97 9*53ee8cc1Swenshuai.xi * 10*53ee8cc1Swenshuai.xi * Author: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> 11*53ee8cc1Swenshuai.xi * Donald Becker, <becker@super.org> 12*53ee8cc1Swenshuai.xi * Alan Cox, <alan@redhat.com> 13*53ee8cc1Swenshuai.xi * Steve Whitehouse, <gw7rrm@eeshack3.swan.ac.uk> 14*53ee8cc1Swenshuai.xi * Jes Sorensen, <Jes.Sorensen@cern.ch> 15*53ee8cc1Swenshuai.xi * 16*53ee8cc1Swenshuai.xi * This program is free software; you can redistribute it and/or 17*53ee8cc1Swenshuai.xi * modify it under the terms of the GNU General Public License 18*53ee8cc1Swenshuai.xi * as published by the Free Software Foundation; either version 19*53ee8cc1Swenshuai.xi * 2 of the License, or (at your option) any later version. 20*53ee8cc1Swenshuai.xi */ 21*53ee8cc1Swenshuai.xi 22*53ee8cc1Swenshuai.xi #ifndef _LINUX_IF_HIPPI_H 23*53ee8cc1Swenshuai.xi #define _LINUX_IF_HIPPI_H 24*53ee8cc1Swenshuai.xi 25*53ee8cc1Swenshuai.xi #include <asm/byteorder.h> 26*53ee8cc1Swenshuai.xi 27*53ee8cc1Swenshuai.xi /* 28*53ee8cc1Swenshuai.xi * HIPPI magic constants. 29*53ee8cc1Swenshuai.xi */ 30*53ee8cc1Swenshuai.xi 31*53ee8cc1Swenshuai.xi #define HIPPI_ALEN 6 /* Bytes in one HIPPI hw-addr */ 32*53ee8cc1Swenshuai.xi #define HIPPI_HLEN sizeof(struct hippi_hdr) 33*53ee8cc1Swenshuai.xi #define HIPPI_ZLEN 0 /* Min. bytes in frame without FCS */ 34*53ee8cc1Swenshuai.xi #define HIPPI_DATA_LEN 65280 /* Max. bytes in payload */ 35*53ee8cc1Swenshuai.xi #define HIPPI_FRAME_LEN (HIPPI_DATA_LEN + HIPPI_HLEN) 36*53ee8cc1Swenshuai.xi /* Max. bytes in frame without FCS */ 37*53ee8cc1Swenshuai.xi 38*53ee8cc1Swenshuai.xi /* 39*53ee8cc1Swenshuai.xi * Define LLC and SNAP constants. 40*53ee8cc1Swenshuai.xi */ 41*53ee8cc1Swenshuai.xi #define HIPPI_EXTENDED_SAP 0xAA 42*53ee8cc1Swenshuai.xi #define HIPPI_UI_CMD 0x03 43*53ee8cc1Swenshuai.xi 44*53ee8cc1Swenshuai.xi 45*53ee8cc1Swenshuai.xi /* 46*53ee8cc1Swenshuai.xi * Do we need to list some sort of ID's here? 47*53ee8cc1Swenshuai.xi */ 48*53ee8cc1Swenshuai.xi 49*53ee8cc1Swenshuai.xi /* 50*53ee8cc1Swenshuai.xi * HIPPI statistics collection data. 51*53ee8cc1Swenshuai.xi */ 52*53ee8cc1Swenshuai.xi 53*53ee8cc1Swenshuai.xi struct hipnet_statistics 54*53ee8cc1Swenshuai.xi { 55*53ee8cc1Swenshuai.xi int rx_packets; /* total packets received */ 56*53ee8cc1Swenshuai.xi int tx_packets; /* total packets transmitted */ 57*53ee8cc1Swenshuai.xi int rx_errors; /* bad packets received */ 58*53ee8cc1Swenshuai.xi int tx_errors; /* packet transmit problems */ 59*53ee8cc1Swenshuai.xi int rx_dropped; /* no space in linux buffers */ 60*53ee8cc1Swenshuai.xi int tx_dropped; /* no space available in linux */ 61*53ee8cc1Swenshuai.xi 62*53ee8cc1Swenshuai.xi /* detailed rx_errors: */ 63*53ee8cc1Swenshuai.xi int rx_length_errors; 64*53ee8cc1Swenshuai.xi int rx_over_errors; /* receiver ring buff overflow */ 65*53ee8cc1Swenshuai.xi int rx_crc_errors; /* recved pkt with crc error */ 66*53ee8cc1Swenshuai.xi int rx_frame_errors; /* recv'd frame alignment error */ 67*53ee8cc1Swenshuai.xi int rx_fifo_errors; /* recv'r fifo overrun */ 68*53ee8cc1Swenshuai.xi int rx_missed_errors; /* receiver missed packet */ 69*53ee8cc1Swenshuai.xi 70*53ee8cc1Swenshuai.xi /* detailed tx_errors */ 71*53ee8cc1Swenshuai.xi int tx_aborted_errors; 72*53ee8cc1Swenshuai.xi int tx_carrier_errors; 73*53ee8cc1Swenshuai.xi int tx_fifo_errors; 74*53ee8cc1Swenshuai.xi int tx_heartbeat_errors; 75*53ee8cc1Swenshuai.xi int tx_window_errors; 76*53ee8cc1Swenshuai.xi }; 77*53ee8cc1Swenshuai.xi 78*53ee8cc1Swenshuai.xi 79*53ee8cc1Swenshuai.xi struct hippi_fp_hdr 80*53ee8cc1Swenshuai.xi { 81*53ee8cc1Swenshuai.xi #if 0 82*53ee8cc1Swenshuai.xi __u8 ulp; /* must contain 4 */ 83*53ee8cc1Swenshuai.xi #if defined (__BIG_ENDIAN_BITFIELD) 84*53ee8cc1Swenshuai.xi __u8 d1_data_present:1; /* must be 1 */ 85*53ee8cc1Swenshuai.xi __u8 start_d2_burst_boundary:1; /* must be zero */ 86*53ee8cc1Swenshuai.xi __u8 reserved:6; /* must be zero */ 87*53ee8cc1Swenshuai.xi #if 0 88*53ee8cc1Swenshuai.xi __u16 reserved1:5; 89*53ee8cc1Swenshuai.xi __u16 d1_area_size:8; /* must be 3 */ 90*53ee8cc1Swenshuai.xi __u16 d2_offset:3; /* must be zero */ 91*53ee8cc1Swenshuai.xi #endif 92*53ee8cc1Swenshuai.xi #elif defined(__LITTLE_ENDIAN_BITFIELD) 93*53ee8cc1Swenshuai.xi __u8 reserved:6; /* must be zero */ 94*53ee8cc1Swenshuai.xi __u8 start_d2_burst_boundary:1; /* must be zero */ 95*53ee8cc1Swenshuai.xi __u8 d1_data_present:1; /* must be 1 */ 96*53ee8cc1Swenshuai.xi #if 0 97*53ee8cc1Swenshuai.xi __u16 d2_offset:3; /* must be zero */ 98*53ee8cc1Swenshuai.xi __u16 d1_area_size:8; /* must be 3 */ 99*53ee8cc1Swenshuai.xi __u16 reserved1:5; /* must be zero */ 100*53ee8cc1Swenshuai.xi #endif 101*53ee8cc1Swenshuai.xi #else 102*53ee8cc1Swenshuai.xi #error "Please fix <asm/byteorder.h>" 103*53ee8cc1Swenshuai.xi #endif 104*53ee8cc1Swenshuai.xi #else 105*53ee8cc1Swenshuai.xi __be32 fixed; 106*53ee8cc1Swenshuai.xi #endif 107*53ee8cc1Swenshuai.xi __be32 d2_size; 108*53ee8cc1Swenshuai.xi } __attribute__ ((packed)); 109*53ee8cc1Swenshuai.xi 110*53ee8cc1Swenshuai.xi struct hippi_le_hdr 111*53ee8cc1Swenshuai.xi { 112*53ee8cc1Swenshuai.xi #if defined (__BIG_ENDIAN_BITFIELD) 113*53ee8cc1Swenshuai.xi __u8 fc:3; 114*53ee8cc1Swenshuai.xi __u8 double_wide:1; 115*53ee8cc1Swenshuai.xi __u8 message_type:4; 116*53ee8cc1Swenshuai.xi #elif defined(__LITTLE_ENDIAN_BITFIELD) 117*53ee8cc1Swenshuai.xi __u8 message_type:4; 118*53ee8cc1Swenshuai.xi __u8 double_wide:1; 119*53ee8cc1Swenshuai.xi __u8 fc:3; 120*53ee8cc1Swenshuai.xi #endif 121*53ee8cc1Swenshuai.xi __u8 dest_switch_addr[3]; 122*53ee8cc1Swenshuai.xi #if defined (__BIG_ENDIAN_BITFIELD) 123*53ee8cc1Swenshuai.xi __u8 dest_addr_type:4, 124*53ee8cc1Swenshuai.xi src_addr_type:4; 125*53ee8cc1Swenshuai.xi #elif defined(__LITTLE_ENDIAN_BITFIELD) 126*53ee8cc1Swenshuai.xi __u8 src_addr_type:4, 127*53ee8cc1Swenshuai.xi dest_addr_type:4; 128*53ee8cc1Swenshuai.xi #endif 129*53ee8cc1Swenshuai.xi __u8 src_switch_addr[3]; 130*53ee8cc1Swenshuai.xi __u16 reserved; 131*53ee8cc1Swenshuai.xi __u8 daddr[HIPPI_ALEN]; 132*53ee8cc1Swenshuai.xi __u16 locally_administered; 133*53ee8cc1Swenshuai.xi __u8 saddr[HIPPI_ALEN]; 134*53ee8cc1Swenshuai.xi } __attribute__ ((packed)); 135*53ee8cc1Swenshuai.xi 136*53ee8cc1Swenshuai.xi #define HIPPI_OUI_LEN 3 137*53ee8cc1Swenshuai.xi /* 138*53ee8cc1Swenshuai.xi * Looks like the dsap and ssap fields have been swapped by mistake in 139*53ee8cc1Swenshuai.xi * RFC 2067 "IP over HIPPI". 140*53ee8cc1Swenshuai.xi */ 141*53ee8cc1Swenshuai.xi struct hippi_snap_hdr 142*53ee8cc1Swenshuai.xi { 143*53ee8cc1Swenshuai.xi __u8 dsap; /* always 0xAA */ 144*53ee8cc1Swenshuai.xi __u8 ssap; /* always 0xAA */ 145*53ee8cc1Swenshuai.xi __u8 ctrl; /* always 0x03 */ 146*53ee8cc1Swenshuai.xi __u8 oui[HIPPI_OUI_LEN]; /* organizational universal id (zero)*/ 147*53ee8cc1Swenshuai.xi __be16 ethertype; /* packet type ID field */ 148*53ee8cc1Swenshuai.xi } __attribute__ ((packed)); 149*53ee8cc1Swenshuai.xi 150*53ee8cc1Swenshuai.xi struct hippi_hdr 151*53ee8cc1Swenshuai.xi { 152*53ee8cc1Swenshuai.xi struct hippi_fp_hdr fp; 153*53ee8cc1Swenshuai.xi struct hippi_le_hdr le; 154*53ee8cc1Swenshuai.xi struct hippi_snap_hdr snap; 155*53ee8cc1Swenshuai.xi } __attribute__ ((packed)); 156*53ee8cc1Swenshuai.xi 157*53ee8cc1Swenshuai.xi #endif /* _LINUX_IF_HIPPI_H */ 158