1 /*	$OpenBSD: rlncmd.h,v 1.1 1999/07/30 13:43:36 d Exp $	*/
2 /*
3  * David Leonard <d@openbsd.org>, 1999. Public Domain.
4  *
5  * RangeLAN2 host-to-card message protocol.
6  */
7 
8 /* Micro-message command header. */
9 struct rln_mm_cmd {
10 	u_int8_t	cmd_letter;	/* Command letter */
11 	u_int8_t	cmd_seq;	/* Incremented on each command */
12 #define RLN_MAXSEQ		0x7c
13 	u_int8_t	cmd_fn;		/* Function number */
14 	u_int8_t	cmd_error;	/* Reserved */
15 };
16 #define RLN_MM_CMD(l,n)		((((unsigned int)l)<<8) | ((unsigned int)n))
17 #define RLN_MM_CMD_LETTER(cmd)	((unsigned char)(((cmd) & 0xff00)>>8))
18 #define RLN_MM_CMD_FUNCTION(cmd) ((unsigned char)((cmd) & 0xff))
19 #define RLN_CMDCODE(letter, num) ((((letter) & 0xff) << 8) | ((num) & 0xff))
20 
21 /* Initialise card, and set operational parameters. */
22 struct rln_mm_init {
23 	struct		rln_mm_cmd mm_cmd;
24 #define RLN_MM_INIT 			{ 'A', 0, 0, 0 }
25 	u_int8_t	enaddr[6];
26 	u_int8_t	opmode;
27 #define RLN_MM_INIT_OPMODE_NORMAL		0
28 #define RLN_MM_INIT_OPMODE_PROMISC		1
29 #define RLN_MM_INIT_OPMODE_PROTOCOL		2
30 	u_int8_t	stationtype;		/* RLN_STATIONTYPE_... */
31 	u_int8_t	hop_period;
32 	u_int8_t	bfreq;
33 	u_int8_t	sfreq;
34 	u_char		channel    : 4;		/* lower bits */
35 	u_char		subchannel : 4;		/* upper bits */
36 	char		mastername[11];
37 	u_char		sec1       : 4;		/* default 3 */
38 	u_char		domain     : 4;		/* default 0 */
39 	u_int8_t	sec2;			/* default 2 */
40 	u_int8_t	sec3;			/* default 1 */
41 	u_int8_t	sync_to;		/* 1 if roaming */
42 	u_int8_t	xxx_pad;		/* zero */
43 	char		syncname[11];
44 };
45 
46 /* Result of initialisation. */
47 struct rln_mm_initted {
48 	struct		rln_mm_cmd mm_cmd;
49 #define RLN_MM_INITTED 			{ 'a', 0, 0, 0 }
50 	u_int8_t	xxx;
51 };
52 
53 /* Start searching for other masters. */
54 struct rln_mm_search {
55 	struct		rln_mm_cmd mm_cmd;
56 #define RLN_MM_SEARCH			{ 'A', 0, 1, 0 }
57 	u_int8_t	xxx1[23];
58 	u_char		xxx2       : 4;
59 	u_char		domain     : 4;
60 	u_int8_t	roaming;
61 	u_int8_t	xxx3;			/* default 0 */
62 	u_int8_t	xxx4;			/* default 1 */
63 	u_int8_t	xxx5;			/* default 0 */
64 	u_int8_t	xxx6[11];
65 };
66 
67 /* Notification that searching has started. */
68 struct rln_mm_searching {
69 	struct		rln_mm_cmd mm_cmd;
70 #define RLN_MM_SEARCHING		{ 'a', 0, 1, 0 }
71 	u_int8_t	xxx;
72 };
73 
74 /* Terminate search. */
75 #define RLN_MM_ABORTSEARCH		{ 'A', 0, 3, 0 }
76 
77 /* Station synchronised to a master. */
78 struct rln_mm_synchronised {
79 	struct		rln_mm_cmd mm_cmd;
80 #define RLN_MM_SYNCHRONISED		{ 'a', 0, 4, 0 }
81 	u_char		channel    : 4;		/* lower bits */
82 	u_char		subchannel : 4;		/* upper bits */
83 	char		mastername[11];
84 	u_int8_t	enaddr[6];
85 };
86 
87 /* Station lost synchronisation with a master. */
88 #define RLN_MM_UNSYNCHRONISED		{ 'a', 0, 5, 0 }
89 
90 /* Send card to sleep. (See rln_wakeup().) */
91 struct rln_mm_standby {
92 	struct		rln_mm_cmd mm_cmd;
93 #define RLN_MM_STANDBY			{ 'A', 0, 6, 0 }
94 	u_int8_t	xxx;			/* default 0 */
95 };
96 
97 /* Set ITO (inactivity timeout timer). */
98 struct rln_mm_setito {
99 	struct		rln_mm_cmd mm_cmd;
100 #define RLN_MM_SETITO			{ 'A', 0, 7, 0 }
101 	u_int8_t	xxx;			/* default 3 */
102 	u_int8_t	timeout;
103 	u_char		bd_wakeup : 1;
104 	u_char		pm_sync : 7;
105 	u_int8_t	sniff_time;
106 };
107 
108 /* ITO acknowledgment */
109 #define RLN_MM_GOTITO			{ 'a', 0, 7, 0 }
110 
111 /* Send keepalive protocol message (?). */
112 #define RLN_MM_SENDKEEPALIVE		{ 'A', 0, 8, 0 }
113 
114 /* Set multicast mode. */
115 struct rln_mm_multicast {
116 	struct		rln_mm_cmd mm_cmd;
117 #define RLN_MM_MULTICAST		{ 'A', 0, 9, 0 }
118 	u_int8_t	enable;
119 };
120 
121 /* Ack multicast mode change. */
122 #define RLN_MM_MULTICASTING		{ 'a', 0, 9, 0 }
123 
124 /* Request statistics. */
125 #define RLN_MM_GETSTATS			{ 'A', 0, 11, 0 }
126 
127 /* Statistics results. */
128 #define RLN_MM_GOTSTATS			{ 'a', 0, 11, 0 }
129 
130 /* Set security ID used in channel. */
131 struct rln_mm_setsecurity {
132 	struct		rln_mm_cmd mm_cmd;
133 #define RLN_MM_SETSECURITY		{ 'A', 0, 12, 0 }
134 	u_int8_t	sec1;
135 	u_int8_t	sec2;
136 	u_int8_t	sec3;
137 };
138 
139 /* Ack set security ID. */
140 #define RLN_MM_GOTSECURITY		{ 'a', 0, 12, 0 }
141 
142 /* Request firmware version. */
143 #define RLN_MM_GETPROMVERSION		{ 'A', 0, 13, 0 }
144 
145 /* Reply with firmware version. */
146 struct rln_mm_gotpromversion {
147 	struct		rln_mm_cmd mm_cmd;
148 #define RLN_MM_GOTPROMVERSION		{ 'a', 0, 13, 0 }
149 	u_int8_t	xxx;			/* sizeof version? */
150 	char		version[7];
151 };
152 
153 /* Request station's MAC address (same as ethernet). */
154 #define RLN_MM_GETENADDR		{ 'A', 0, 14, 0 }
155 
156 /* Reply with station's MAC address. */
157 struct rln_mm_gotenaddr {
158 	struct		rln_mm_cmd mm_cmd;
159 #define RLN_MM_GOTENADDR		{ 'a', 0, 14, 0 }
160 	u_int8_t	xxx;
161 	u_int8_t	enaddr[6];
162 };
163 
164 /* Tune various channel parameters. */
165 struct rln_mm_setmagic {
166 	struct		rln_mm_cmd mm_cmd;
167 #define RLN_MM_SETMAGIC			{ 'A', 0, 16, 0 }
168 	u_char		fairness_slot : 3;
169 	u_char		deferral_slot : 5;
170 	u_int8_t	regular_mac_retry;	/* default 0x07 */
171 	u_int8_t	frag_mac_retry;		/* default 0x0a */
172 	u_int8_t	regular_mac_qfsk;	/* default 0x02 */
173 	u_int8_t	frag_mac_qfsk;		/* default 0x05 */
174 	u_int8_t	xxx1;			/* default 0xff */
175 	u_int8_t	xxx2;			/* default 0xff */
176 	u_int8_t	xxx3;			/* default 0xff */
177 	u_int8_t	xxx4;			/* zero */
178 };
179 
180 /* Ack channel tuning. */
181 #define RLN_MM_GOTMAGIC			{ 'a', 0, 16, 0 }
182 
183 /* Set roaming parameters - used when multiple masters available. */
184 struct rln_mm_setroaming {
185 	struct		rln_mm_cmd mm_cmd;
186 #define RLN_MM_SETROAMING		{ 'A', 0, 17, 0 }
187 	u_int8_t	sync_alarm;
188 	u_int8_t	retry_thresh;
189 	u_int8_t	rssi_threshold;
190 	u_int8_t	xxx1;			/* default 0x5a */
191 	u_int8_t	sync_rssi_threshold;
192 	u_int8_t	xxx2;			/* default 0xa5 */
193 	u_int8_t	missed_sync;
194 };
195 
196 /* Ack roaming parameter change. */
197 #define RLN_MM_GOTROAMING		{ 'a', 0, 17, 0 }
198 
199 #define RLN_MM_ROAMING			{ 'a', 0, 18, 0 }
200 #define RLN_MM_ROAM			{ 'A', 0, 19, 0 }
201 
202 /* Hardware fault notification. (Usually the antenna.) */
203 #define RLN_MM_FAULT			{ 'a', 0, 20, 0 }
204 
205 #define RLN_MM_EEPROM_PROTECT		{ 'A', 0, 23, 0 }
206 #define RLN_MM_EEPROM_PROTECTED		{ 'a', 0, 23, 0 }
207 #define RLN_MM_EEPROM_UNPROTECT		{ 'A', 0, 24, 0 }
208 #define RLN_MM_EEPROM_UNPROTECTED	{ 'a', 0, 24, 0 }
209 
210 /* Receive hop statistics. */
211 #define RLN_MM_HOP_STATISTICS		{ 'a', 0, 35, 0 }
212 
213 /* Transmit a frame on the channel. */
214 struct rln_mm_sendpacket {
215 	struct		rln_mm_cmd mm_cmd;
216 #define RLN_MM_SENDPACKET		{ 'B', 0, 0, 0 }
217 	u_int8_t	mode;
218 #define RLN_MM_SENDPACKET_MODE_BIT7	0x80
219 #define RLN_MM_SENDPACKET_MODE_ZFIRST	0x20
220 #define RLN_MM_SENDPACKET_MODE_QFSK	0x03
221 	u_int8_t	power;			/* default 0x70 */
222 	u_int8_t	length_lo;
223 	u_int8_t	length_hi;
224 	u_int8_t	xxx1;			/* default 0 */
225 	u_int8_t	xxx2;			/* default 0 */
226 	u_int8_t	sequence;		/* must increment */
227 	u_int8_t	xxx3;			/* default 0 */
228 };
229 
230 /* Ack packet transmission. */
231 #define RLN_MM_SENTPACKET		{ 'b', 0, 0, 0 }
232 
233 /* Notification of frame received from channel. */
234 struct rln_mm_recvpacket {
235 	struct		rln_mm_cmd mm_cmd;
236 #define RLN_MM_RECVPACKET		{ 'b', 0, 1, 0 }
237 	u_int8_t	xxx[8];
238 };
239 
240 /* Disable hopping. (?) */
241 struct rln_mm_disablehopping {
242 	struct		rln_mm_cmd mm_cmd;
243 #define RLN_MM_DISABLEHOPPING		{ 'C', 0, 9, 0 }
244 	u_int8_t	hopflag;
245 #define RLN_MM_DISABLEHOPPING_HOPFLAG_DISABLE	0x52
246 };
247 
248