1 /* $NetBSD: if_eco.h,v 1.8 2008/02/20 17:05:52 matt Exp $ */ 2 3 /*- 4 * Copyright (c) 2001 Ben Harris 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #ifndef _NET_IF_ECO_H_ 31 #define _NET_IF_ECO_H_ 32 33 #include <sys/callout.h> 34 #include <sys/mbuf.h> 35 #include <sys/queue.h> 36 37 #include <net/if.h> 38 39 /* 40 * Econet headers come in two forms. The initial frame of an exchange 41 * has source and destination addresses, a control byte and a port. 42 * Later frames just have source and destination addresses. 43 * 44 * Complete packets are generally passed around with the full header on, 45 * even if this means assembling them from two separate frames. 46 */ 47 #define ECO_ADDR_LEN 2 /* Length of an Econet address */ 48 #define ECO_HDR_LEN 6 /* Two addresses, a port and a control byte */ 49 #define ECO_SHDR_LEN 4 /* "Short" Econet header: just two addresses */ 50 /* #define ECO_MTU 8192 * Default MTU */ 51 #define ECO_IPMTU 1280 /* MTU for IP used by RISC iX */ 52 #define ECO_MTU ECO_IPMTU 53 54 struct eco_header { 55 uint8_t eco_dhost[ECO_ADDR_LEN]; 56 uint8_t eco_shost[ECO_ADDR_LEN]; 57 uint8_t eco_control; 58 uint8_t eco_port; 59 } __packed; 60 61 #define ECO_PORT_IMMEDIATE 0x00 62 #define ECO_PORT_DSTAPE 0x54 /* DigitalServicesTapeStore */ 63 #define ECO_PORT_FS 0x99 /* FileServerCommand */ 64 #define ECO_PORT_BRIDGE 0x9C /* Bridge */ 65 #define ECO_PORT_PSINQREP 0x9E /* PrinterServerInquiryReply */ 66 #define ECO_PORT_PSINQ 0x9F /* PrinterServerInquiry */ 67 #define ECO_PORT_FAST 0xA0 /* SJ *FAST protocol */ 68 #define ECO_PORT_NEXNETFIND 0xA1 /* SJ Nexus net find reply port */ 69 #define ECO_PORT_FINDSRV 0xB0 /* FindServer */ 70 #define ECO_PORT_FINDSRVREP 0xB1 /* FindServerReply */ 71 #define ECO_PORT_TTXTCMD 0xB2 /* TeletextServerCommand */ 72 #define ECO_PORT_TTXTPAGE 0xB3 /* TeletextServerPage */ 73 #define ECO_PORT_OLDPSDATA 0xD0 /* OldPrinterServer */ 74 #define ECO_PORT_PSDATA 0xD1 /* PrinterServer */ 75 #define ECO_PORT_IP 0xD2 /* TCPIPProtocolSuite */ 76 #define ECO_PORT_SIDSLAVE 0xD3 /* SIDFrameSlave */ 77 #define ECO_PORT_SCROLLARAMA 0xD4 /* Scrollarama */ 78 #define ECO_PORT_PHONE 0xD5 /* Phone */ 79 #define ECO_PORT_BCASTCTL 0xD6 /* BroadcastControl */ 80 #define ECO_PORT_BCASTDATA 0xD7 /* BroadcastData */ 81 #define ECO_PORT_IMPLICENCE 0xD8 /* ImpressionLicenceChecker */ 82 #define ECO_PORT_SQUIRREL 0xD9 /* DigitalServicesSquirrel */ 83 #define ECO_PORT_SID2NDARY 0xDA /* SIDSecondary */ 84 #define ECO_PORT_SQUIRREL2 0xDB /* DigitalServicesSquirrel2 */ 85 #define ECO_PORT_DDCTL 0xDC /* DataDistributionControl */ 86 #define ECO_PORT_DDDATA 0xDD /* DataDistributionData */ 87 #define ECO_PORT_CLASSROM 0xDE /* ClassROM */ 88 #define ECO_PORT_PSCMD 0xDF /* PrinterSpoolerCommand */ 89 90 /* Control bytes for immediate operations. */ 91 #define ECO_CTL_PEEK 0x81 92 #define ECO_CTL_POKE 0x82 93 #define ECO_CTL_JSR 0x83 94 #define ECO_CTL_USERPROC 0x84 95 #define ECO_CTL_OSPROC 0x85 96 #define ECO_CTL_HALT 0x86 97 #define ECO_CTL_CONTINUE 0x87 98 #define ECO_CTL_MACHINEPEEK 0x88 99 #define ECO_CTL_GETREGISTERS 0x89 100 101 /* Control bytes for IP */ 102 #define ECO_CTL_IP 0x81 103 #define ECO_CTL_IPBCAST_REPLY 0x8E 104 #define ECO_CTL_IPBCAST_REQUEST 0x8F 105 #define ECO_CTL_ARP_REQUEST 0xA1 106 #define ECO_CTL_ARP_REPLY 0xA2 107 108 struct eco_arp { 109 uint8_t ecar_spa[4]; 110 uint8_t ecar_tpa[4]; 111 }; 112 113 enum eco_state { 114 ECO_UNKNOWN, ECO_IDLE, ECO_SCOUT_RCVD, 115 ECO_SCOUT_SENT, ECO_DATA_SENT, ECO_IMMED_SENT, 116 ECO_DONE 117 }; 118 119 120 /* 121 * This structure contains a packet that might need retransmitting, 122 * together with a callout to trigger retransmission. They're kept on 123 * a per-interface list so they can be freed when an interface is 124 * downed. 125 */ 126 struct eco_retry { 127 LIST_ENTRY(eco_retry) er_link; 128 struct callout er_callout; 129 struct mbuf *er_packet; 130 struct ifnet *er_ifp; 131 }; 132 133 /* 134 * Common structure used to store state about an Econet interface. 135 */ 136 struct ecocom { 137 struct ifnet ec_if; 138 int (*ec_claimwire)(struct ifnet *); 139 void (*ec_txframe)(struct ifnet *, struct mbuf *); 140 enum eco_state ec_state; 141 struct mbuf *ec_scout; 142 struct mbuf *ec_packet; 143 LIST_HEAD(, eco_retry) ec_retries; 144 }; 145 146 #ifdef _KERNEL 147 void eco_ifattach(struct ifnet *, const uint8_t *); 148 void eco_ifdetach(struct ifnet *); 149 int eco_init(struct ifnet *); 150 void eco_stop(struct ifnet *, int); 151 152 char *eco_sprintf(const uint8_t *); 153 154 struct mbuf * eco_inputframe(struct ifnet *, struct mbuf *); 155 void eco_inputidle(struct ifnet *); 156 #endif 157 158 #endif /* !_NET_IF_ECO_H_ */ 159