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