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