1 /* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License as published by 4 * the Free Software Foundation; either version 2 of the License, or 5 * (at your option) any later version. 6 * 7 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) 8 * 9 * Most of this code is based on the SDL diagrams published in the 7th ARRL 10 * Computer Networking Conference papers. The diagrams have mistakes in them, 11 * but are mostly correct. Before you modify the code could you read the SDL 12 * diagrams as the code is not obvious and probably very easy to break. 13 */ 14 #include <linux/errno.h> 15 #include <linux/types.h> 16 #include <linux/socket.h> 17 #include <linux/in.h> 18 #include <linux/kernel.h> 19 #include <linux/timer.h> 20 #include <linux/string.h> 21 #include <linux/sockios.h> 22 #include <linux/net.h> 23 #include <net/ax25.h> 24 #include <linux/inet.h> 25 #include <linux/netdevice.h> 26 #include <linux/skbuff.h> 27 #include <net/sock.h> 28 #include <net/tcp_states.h> 29 #include <linux/fcntl.h> 30 #include <linux/mm.h> 31 #include <linux/interrupt.h> 32 #include <net/rose.h> 33 34 /* 35 * State machine for state 1, Awaiting Call Accepted State. 36 * The handling of the timer(s) is in file rose_timer.c. 37 * Handling of state 0 and connection release is in af_rose.c. 38 */ 39 static int rose_state1_machine(struct sock *sk, struct sk_buff *skb, int frametype) 40 { 41 struct rose_sock *rose = rose_sk(sk); 42 43 switch (frametype) { 44 case ROSE_CALL_ACCEPTED: 45 rose_stop_timer(sk); 46 rose_start_idletimer(sk); 47 rose->condition = 0x00; 48 rose->vs = 0; 49 rose->va = 0; 50 rose->vr = 0; 51 rose->vl = 0; 52 rose->state = ROSE_STATE_3; 53 sk->sk_state = TCP_ESTABLISHED; 54 if (!sock_flag(sk, SOCK_DEAD)) 55 sk->sk_state_change(sk); 56 break; 57 58 case ROSE_CLEAR_REQUEST: 59 rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION); 60 rose_disconnect(sk, ECONNREFUSED, skb->data[3], skb->data[4]); 61 rose->neighbour->use--; 62 break; 63 64 default: 65 break; 66 } 67 68 return 0; 69 } 70 71 /* 72 * State machine for state 2, Awaiting Clear Confirmation State. 73 * The handling of the timer(s) is in file rose_timer.c 74 * Handling of state 0 and connection release is in af_rose.c. 75 */ 76 static int rose_state2_machine(struct sock *sk, struct sk_buff *skb, int frametype) 77 { 78 struct rose_sock *rose = rose_sk(sk); 79 80 switch (frametype) { 81 case ROSE_CLEAR_REQUEST: 82 rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION); 83 rose_disconnect(sk, 0, skb->data[3], skb->data[4]); 84 rose->neighbour->use--; 85 break; 86 87 case ROSE_CLEAR_CONFIRMATION: 88 rose_disconnect(sk, 0, -1, -1); 89 rose->neighbour->use--; 90 break; 91 92 default: 93 break; 94 } 95 96 return 0; 97 } 98 99 /* 100 * State machine for state 3, Connected State. 101 * The handling of the timer(s) is in file rose_timer.c 102 * Handling of state 0 and connection release is in af_rose.c. 103 */ 104 static int rose_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype, int ns, int nr, int q, int d, int m) 105 { 106 struct rose_sock *rose = rose_sk(sk); 107 int queued = 0; 108 109 switch (frametype) { 110 case ROSE_RESET_REQUEST: 111 rose_stop_timer(sk); 112 rose_start_idletimer(sk); 113 rose_write_internal(sk, ROSE_RESET_CONFIRMATION); 114 rose->condition = 0x00; 115 rose->vs = 0; 116 rose->vr = 0; 117 rose->va = 0; 118 rose->vl = 0; 119 rose_requeue_frames(sk); 120 break; 121 122 case ROSE_CLEAR_REQUEST: 123 rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION); 124 rose_disconnect(sk, 0, skb->data[3], skb->data[4]); 125 rose->neighbour->use--; 126 break; 127 128 case ROSE_RR: 129 case ROSE_RNR: 130 if (!rose_validate_nr(sk, nr)) { 131 rose_write_internal(sk, ROSE_RESET_REQUEST); 132 rose->condition = 0x00; 133 rose->vs = 0; 134 rose->vr = 0; 135 rose->va = 0; 136 rose->vl = 0; 137 rose->state = ROSE_STATE_4; 138 rose_start_t2timer(sk); 139 rose_stop_idletimer(sk); 140 } else { 141 rose_frames_acked(sk, nr); 142 if (frametype == ROSE_RNR) { 143 rose->condition |= ROSE_COND_PEER_RX_BUSY; 144 } else { 145 rose->condition &= ~ROSE_COND_PEER_RX_BUSY; 146 } 147 } 148 break; 149 150 case ROSE_DATA: /* XXX */ 151 rose->condition &= ~ROSE_COND_PEER_RX_BUSY; 152 if (!rose_validate_nr(sk, nr)) { 153 rose_write_internal(sk, ROSE_RESET_REQUEST); 154 rose->condition = 0x00; 155 rose->vs = 0; 156 rose->vr = 0; 157 rose->va = 0; 158 rose->vl = 0; 159 rose->state = ROSE_STATE_4; 160 rose_start_t2timer(sk); 161 rose_stop_idletimer(sk); 162 break; 163 } 164 rose_frames_acked(sk, nr); 165 if (ns == rose->vr) { 166 rose_start_idletimer(sk); 167 if (sk_filter_trim_cap(sk, skb, ROSE_MIN_LEN) == 0 && 168 __sock_queue_rcv_skb(sk, skb) == 0) { 169 rose->vr = (rose->vr + 1) % ROSE_MODULUS; 170 queued = 1; 171 } else { 172 /* Should never happen ! */ 173 rose_write_internal(sk, ROSE_RESET_REQUEST); 174 rose->condition = 0x00; 175 rose->vs = 0; 176 rose->vr = 0; 177 rose->va = 0; 178 rose->vl = 0; 179 rose->state = ROSE_STATE_4; 180 rose_start_t2timer(sk); 181 rose_stop_idletimer(sk); 182 break; 183 } 184 if (atomic_read(&sk->sk_rmem_alloc) > 185 (sk->sk_rcvbuf >> 1)) 186 rose->condition |= ROSE_COND_OWN_RX_BUSY; 187 } 188 /* 189 * If the window is full, ack the frame, else start the 190 * acknowledge hold back timer. 191 */ 192 if (((rose->vl + sysctl_rose_window_size) % ROSE_MODULUS) == rose->vr) { 193 rose->condition &= ~ROSE_COND_ACK_PENDING; 194 rose_stop_timer(sk); 195 rose_enquiry_response(sk); 196 } else { 197 rose->condition |= ROSE_COND_ACK_PENDING; 198 rose_start_hbtimer(sk); 199 } 200 break; 201 202 default: 203 printk(KERN_WARNING "ROSE: unknown %02X in state 3\n", frametype); 204 break; 205 } 206 207 return queued; 208 } 209 210 /* 211 * State machine for state 4, Awaiting Reset Confirmation State. 212 * The handling of the timer(s) is in file rose_timer.c 213 * Handling of state 0 and connection release is in af_rose.c. 214 */ 215 static int rose_state4_machine(struct sock *sk, struct sk_buff *skb, int frametype) 216 { 217 struct rose_sock *rose = rose_sk(sk); 218 219 switch (frametype) { 220 case ROSE_RESET_REQUEST: 221 rose_write_internal(sk, ROSE_RESET_CONFIRMATION); 222 /* fall through */ 223 case ROSE_RESET_CONFIRMATION: 224 rose_stop_timer(sk); 225 rose_start_idletimer(sk); 226 rose->condition = 0x00; 227 rose->va = 0; 228 rose->vr = 0; 229 rose->vs = 0; 230 rose->vl = 0; 231 rose->state = ROSE_STATE_3; 232 rose_requeue_frames(sk); 233 break; 234 235 case ROSE_CLEAR_REQUEST: 236 rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION); 237 rose_disconnect(sk, 0, skb->data[3], skb->data[4]); 238 rose->neighbour->use--; 239 break; 240 241 default: 242 break; 243 } 244 245 return 0; 246 } 247 248 /* 249 * State machine for state 5, Awaiting Call Acceptance State. 250 * The handling of the timer(s) is in file rose_timer.c 251 * Handling of state 0 and connection release is in af_rose.c. 252 */ 253 static int rose_state5_machine(struct sock *sk, struct sk_buff *skb, int frametype) 254 { 255 if (frametype == ROSE_CLEAR_REQUEST) { 256 rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION); 257 rose_disconnect(sk, 0, skb->data[3], skb->data[4]); 258 rose_sk(sk)->neighbour->use--; 259 } 260 261 return 0; 262 } 263 264 /* Higher level upcall for a LAPB frame */ 265 int rose_process_rx_frame(struct sock *sk, struct sk_buff *skb) 266 { 267 struct rose_sock *rose = rose_sk(sk); 268 int queued = 0, frametype, ns, nr, q, d, m; 269 270 if (rose->state == ROSE_STATE_0) 271 return 0; 272 273 frametype = rose_decode(skb, &ns, &nr, &q, &d, &m); 274 275 switch (rose->state) { 276 case ROSE_STATE_1: 277 queued = rose_state1_machine(sk, skb, frametype); 278 break; 279 case ROSE_STATE_2: 280 queued = rose_state2_machine(sk, skb, frametype); 281 break; 282 case ROSE_STATE_3: 283 queued = rose_state3_machine(sk, skb, frametype, ns, nr, q, d, m); 284 break; 285 case ROSE_STATE_4: 286 queued = rose_state4_machine(sk, skb, frametype); 287 break; 288 case ROSE_STATE_5: 289 queued = rose_state5_machine(sk, skb, frametype); 290 break; 291 } 292 293 rose_kick(sk); 294 295 return queued; 296 } 297