linux/net/lapb/lapb_in.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *      LAPB release 002
   4 *
   5 *      This code REQUIRES 2.1.15 or higher/ NET3.038
   6 *
   7 *      History
   8 *      LAPB 001        Jonathan Naulor Started Coding
   9 *      LAPB 002        Jonathan Naylor New timer architecture.
  10 *      2000-10-29      Henner Eisen    lapb_data_indication() return status.
  11 */
  12
  13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  14
  15#include <linux/errno.h>
  16#include <linux/types.h>
  17#include <linux/socket.h>
  18#include <linux/in.h>
  19#include <linux/kernel.h>
  20#include <linux/timer.h>
  21#include <linux/string.h>
  22#include <linux/sockios.h>
  23#include <linux/net.h>
  24#include <linux/inet.h>
  25#include <linux/netdevice.h>
  26#include <linux/skbuff.h>
  27#include <linux/slab.h>
  28#include <net/sock.h>
  29#include <linux/uaccess.h>
  30#include <linux/fcntl.h>
  31#include <linux/mm.h>
  32#include <linux/interrupt.h>
  33#include <net/lapb.h>
  34
  35/*
  36 *      State machine for state 0, Disconnected State.
  37 *      The handling of the timer(s) is in file lapb_timer.c.
  38 */
  39static void lapb_state0_machine(struct lapb_cb *lapb, struct sk_buff *skb,
  40                                struct lapb_frame *frame)
  41{
  42        switch (frame->type) {
  43        case LAPB_SABM:
  44                lapb_dbg(1, "(%p) S0 RX SABM(%d)\n", lapb->dev, frame->pf);
  45                if (lapb->mode & LAPB_EXTENDED) {
  46                        lapb_dbg(1, "(%p) S0 TX DM(%d)\n",
  47                                 lapb->dev, frame->pf);
  48                        lapb_send_control(lapb, LAPB_DM, frame->pf,
  49                                          LAPB_RESPONSE);
  50                } else {
  51                        lapb_dbg(1, "(%p) S0 TX UA(%d)\n",
  52                                 lapb->dev, frame->pf);
  53                        lapb_dbg(0, "(%p) S0 -> S3\n", lapb->dev);
  54                        lapb_send_control(lapb, LAPB_UA, frame->pf,
  55                                          LAPB_RESPONSE);
  56                        lapb_stop_t1timer(lapb);
  57                        lapb_stop_t2timer(lapb);
  58                        lapb->state     = LAPB_STATE_3;
  59                        lapb->condition = 0x00;
  60                        lapb->n2count   = 0;
  61                        lapb->vs        = 0;
  62                        lapb->vr        = 0;
  63                        lapb->va        = 0;
  64                        lapb_connect_indication(lapb, LAPB_OK);
  65                }
  66                break;
  67
  68        case LAPB_SABME:
  69                lapb_dbg(1, "(%p) S0 RX SABME(%d)\n", lapb->dev, frame->pf);
  70                if (lapb->mode & LAPB_EXTENDED) {
  71                        lapb_dbg(1, "(%p) S0 TX UA(%d)\n",
  72                                 lapb->dev, frame->pf);
  73                        lapb_dbg(0, "(%p) S0 -> S3\n", lapb->dev);
  74                        lapb_send_control(lapb, LAPB_UA, frame->pf,
  75                                          LAPB_RESPONSE);
  76                        lapb_stop_t1timer(lapb);
  77                        lapb_stop_t2timer(lapb);
  78                        lapb->state     = LAPB_STATE_3;
  79                        lapb->condition = 0x00;
  80                        lapb->n2count   = 0;
  81                        lapb->vs        = 0;
  82                        lapb->vr        = 0;
  83                        lapb->va        = 0;
  84                        lapb_connect_indication(lapb, LAPB_OK);
  85                } else {
  86                        lapb_dbg(1, "(%p) S0 TX DM(%d)\n",
  87                                 lapb->dev, frame->pf);
  88                        lapb_send_control(lapb, LAPB_DM, frame->pf,
  89                                          LAPB_RESPONSE);
  90                }
  91                break;
  92
  93        case LAPB_DISC:
  94                lapb_dbg(1, "(%p) S0 RX DISC(%d)\n", lapb->dev, frame->pf);
  95                lapb_dbg(1, "(%p) S0 TX UA(%d)\n", lapb->dev, frame->pf);
  96                lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE);
  97                break;
  98
  99        default:
 100                break;
 101        }
 102
 103        kfree_skb(skb);
 104}
 105
 106/*
 107 *      State machine for state 1, Awaiting Connection State.
 108 *      The handling of the timer(s) is in file lapb_timer.c.
 109 */
 110static void lapb_state1_machine(struct lapb_cb *lapb, struct sk_buff *skb,
 111                                struct lapb_frame *frame)
 112{
 113        switch (frame->type) {
 114        case LAPB_SABM:
 115                lapb_dbg(1, "(%p) S1 RX SABM(%d)\n", lapb->dev, frame->pf);
 116                if (lapb->mode & LAPB_EXTENDED) {
 117                        lapb_dbg(1, "(%p) S1 TX DM(%d)\n",
 118                                 lapb->dev, frame->pf);
 119                        lapb_send_control(lapb, LAPB_DM, frame->pf,
 120                                          LAPB_RESPONSE);
 121                } else {
 122                        lapb_dbg(1, "(%p) S1 TX UA(%d)\n",
 123                                 lapb->dev, frame->pf);
 124                        lapb_send_control(lapb, LAPB_UA, frame->pf,
 125                                          LAPB_RESPONSE);
 126                }
 127                break;
 128
 129        case LAPB_SABME:
 130                lapb_dbg(1, "(%p) S1 RX SABME(%d)\n", lapb->dev, frame->pf);
 131                if (lapb->mode & LAPB_EXTENDED) {
 132                        lapb_dbg(1, "(%p) S1 TX UA(%d)\n",
 133                                 lapb->dev, frame->pf);
 134                        lapb_send_control(lapb, LAPB_UA, frame->pf,
 135                                          LAPB_RESPONSE);
 136                } else {
 137                        lapb_dbg(1, "(%p) S1 TX DM(%d)\n",
 138                                 lapb->dev, frame->pf);
 139                        lapb_send_control(lapb, LAPB_DM, frame->pf,
 140                                          LAPB_RESPONSE);
 141                }
 142                break;
 143
 144        case LAPB_DISC:
 145                lapb_dbg(1, "(%p) S1 RX DISC(%d)\n", lapb->dev, frame->pf);
 146                lapb_dbg(1, "(%p) S1 TX DM(%d)\n", lapb->dev, frame->pf);
 147                lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE);
 148                break;
 149
 150        case LAPB_UA:
 151                lapb_dbg(1, "(%p) S1 RX UA(%d)\n", lapb->dev, frame->pf);
 152                if (frame->pf) {
 153                        lapb_dbg(0, "(%p) S1 -> S3\n", lapb->dev);
 154                        lapb_stop_t1timer(lapb);
 155                        lapb_stop_t2timer(lapb);
 156                        lapb->state     = LAPB_STATE_3;
 157                        lapb->condition = 0x00;
 158                        lapb->n2count   = 0;
 159                        lapb->vs        = 0;
 160                        lapb->vr        = 0;
 161                        lapb->va        = 0;
 162                        lapb_connect_confirmation(lapb, LAPB_OK);
 163                }
 164                break;
 165
 166        case LAPB_DM:
 167                lapb_dbg(1, "(%p) S1 RX DM(%d)\n", lapb->dev, frame->pf);
 168                if (frame->pf) {
 169                        lapb_dbg(0, "(%p) S1 -> S0\n", lapb->dev);
 170                        lapb_clear_queues(lapb);
 171                        lapb->state = LAPB_STATE_0;
 172                        lapb_start_t1timer(lapb);
 173                        lapb_stop_t2timer(lapb);
 174                        lapb_disconnect_indication(lapb, LAPB_REFUSED);
 175                }
 176                break;
 177        }
 178
 179        kfree_skb(skb);
 180}
 181
 182/*
 183 *      State machine for state 2, Awaiting Release State.
 184 *      The handling of the timer(s) is in file lapb_timer.c
 185 */
 186static void lapb_state2_machine(struct lapb_cb *lapb, struct sk_buff *skb,
 187                                struct lapb_frame *frame)
 188{
 189        switch (frame->type) {
 190        case LAPB_SABM:
 191        case LAPB_SABME:
 192                lapb_dbg(1, "(%p) S2 RX {SABM,SABME}(%d)\n",
 193                         lapb->dev, frame->pf);
 194                lapb_dbg(1, "(%p) S2 TX DM(%d)\n", lapb->dev, frame->pf);
 195                lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE);
 196                break;
 197
 198        case LAPB_DISC:
 199                lapb_dbg(1, "(%p) S2 RX DISC(%d)\n", lapb->dev, frame->pf);
 200                lapb_dbg(1, "(%p) S2 TX UA(%d)\n", lapb->dev, frame->pf);
 201                lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE);
 202                break;
 203
 204        case LAPB_UA:
 205                lapb_dbg(1, "(%p) S2 RX UA(%d)\n", lapb->dev, frame->pf);
 206                if (frame->pf) {
 207                        lapb_dbg(0, "(%p) S2 -> S0\n", lapb->dev);
 208                        lapb->state = LAPB_STATE_0;
 209                        lapb_start_t1timer(lapb);
 210                        lapb_stop_t2timer(lapb);
 211                        lapb_disconnect_confirmation(lapb, LAPB_OK);
 212                }
 213                break;
 214
 215        case LAPB_DM:
 216                lapb_dbg(1, "(%p) S2 RX DM(%d)\n", lapb->dev, frame->pf);
 217                if (frame->pf) {
 218                        lapb_dbg(0, "(%p) S2 -> S0\n", lapb->dev);
 219                        lapb->state = LAPB_STATE_0;
 220                        lapb_start_t1timer(lapb);
 221                        lapb_stop_t2timer(lapb);
 222                        lapb_disconnect_confirmation(lapb, LAPB_NOTCONNECTED);
 223                }
 224                break;
 225
 226        case LAPB_I:
 227        case LAPB_REJ:
 228        case LAPB_RNR:
 229        case LAPB_RR:
 230                lapb_dbg(1, "(%p) S2 RX {I,REJ,RNR,RR}(%d)\n",
 231                       lapb->dev, frame->pf);
 232                lapb_dbg(1, "(%p) S2 RX DM(%d)\n", lapb->dev, frame->pf);
 233                if (frame->pf)
 234                        lapb_send_control(lapb, LAPB_DM, frame->pf,
 235                                          LAPB_RESPONSE);
 236                break;
 237        }
 238
 239        kfree_skb(skb);
 240}
 241
 242/*
 243 *      State machine for state 3, Connected State.
 244 *      The handling of the timer(s) is in file lapb_timer.c
 245 */
 246static void lapb_state3_machine(struct lapb_cb *lapb, struct sk_buff *skb,
 247                                struct lapb_frame *frame)
 248{
 249        int queued = 0;
 250        int modulus = (lapb->mode & LAPB_EXTENDED) ? LAPB_EMODULUS :
 251                                                     LAPB_SMODULUS;
 252
 253        switch (frame->type) {
 254        case LAPB_SABM:
 255                lapb_dbg(1, "(%p) S3 RX SABM(%d)\n", lapb->dev, frame->pf);
 256                if (lapb->mode & LAPB_EXTENDED) {
 257                        lapb_dbg(1, "(%p) S3 TX DM(%d)\n",
 258                                 lapb->dev, frame->pf);
 259                        lapb_send_control(lapb, LAPB_DM, frame->pf,
 260                                          LAPB_RESPONSE);
 261                } else {
 262                        lapb_dbg(1, "(%p) S3 TX UA(%d)\n",
 263                                 lapb->dev, frame->pf);
 264                        lapb_send_control(lapb, LAPB_UA, frame->pf,
 265                                          LAPB_RESPONSE);
 266                        lapb_stop_t1timer(lapb);
 267                        lapb_stop_t2timer(lapb);
 268                        lapb->condition = 0x00;
 269                        lapb->n2count   = 0;
 270                        lapb->vs        = 0;
 271                        lapb->vr        = 0;
 272                        lapb->va        = 0;
 273                        lapb_requeue_frames(lapb);
 274                }
 275                break;
 276
 277        case LAPB_SABME:
 278                lapb_dbg(1, "(%p) S3 RX SABME(%d)\n", lapb->dev, frame->pf);
 279                if (lapb->mode & LAPB_EXTENDED) {
 280                        lapb_dbg(1, "(%p) S3 TX UA(%d)\n",
 281                                 lapb->dev, frame->pf);
 282                        lapb_send_control(lapb, LAPB_UA, frame->pf,
 283                                          LAPB_RESPONSE);
 284                        lapb_stop_t1timer(lapb);
 285                        lapb_stop_t2timer(lapb);
 286                        lapb->condition = 0x00;
 287                        lapb->n2count   = 0;
 288                        lapb->vs        = 0;
 289                        lapb->vr        = 0;
 290                        lapb->va        = 0;
 291                        lapb_requeue_frames(lapb);
 292                } else {
 293                        lapb_dbg(1, "(%p) S3 TX DM(%d)\n",
 294                                 lapb->dev, frame->pf);
 295                        lapb_send_control(lapb, LAPB_DM, frame->pf,
 296                                          LAPB_RESPONSE);
 297                }
 298                break;
 299
 300        case LAPB_DISC:
 301                lapb_dbg(1, "(%p) S3 RX DISC(%d)\n", lapb->dev, frame->pf);
 302                lapb_dbg(0, "(%p) S3 -> S0\n", lapb->dev);
 303                lapb_clear_queues(lapb);
 304                lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE);
 305                lapb_start_t1timer(lapb);
 306                lapb_stop_t2timer(lapb);
 307                lapb->state = LAPB_STATE_0;
 308                lapb_disconnect_indication(lapb, LAPB_OK);
 309                break;
 310
 311        case LAPB_DM:
 312                lapb_dbg(1, "(%p) S3 RX DM(%d)\n", lapb->dev, frame->pf);
 313                lapb_dbg(0, "(%p) S3 -> S0\n", lapb->dev);
 314                lapb_clear_queues(lapb);
 315                lapb->state = LAPB_STATE_0;
 316                lapb_start_t1timer(lapb);
 317                lapb_stop_t2timer(lapb);
 318                lapb_disconnect_indication(lapb, LAPB_NOTCONNECTED);
 319                break;
 320
 321        case LAPB_RNR:
 322                lapb_dbg(1, "(%p) S3 RX RNR(%d) R%d\n",
 323                         lapb->dev, frame->pf, frame->nr);
 324                lapb->condition |= LAPB_PEER_RX_BUSY_CONDITION;
 325                lapb_check_need_response(lapb, frame->cr, frame->pf);
 326                if (lapb_validate_nr(lapb, frame->nr)) {
 327                        lapb_check_iframes_acked(lapb, frame->nr);
 328                } else {
 329                        lapb->frmr_data = *frame;
 330                        lapb->frmr_type = LAPB_FRMR_Z;
 331                        lapb_transmit_frmr(lapb);
 332                        lapb_dbg(0, "(%p) S3 -> S4\n", lapb->dev);
 333                        lapb_start_t1timer(lapb);
 334                        lapb_stop_t2timer(lapb);
 335                        lapb->state   = LAPB_STATE_4;
 336                        lapb->n2count = 0;
 337                }
 338                break;
 339
 340        case LAPB_RR:
 341                lapb_dbg(1, "(%p) S3 RX RR(%d) R%d\n",
 342                         lapb->dev, frame->pf, frame->nr);
 343                lapb->condition &= ~LAPB_PEER_RX_BUSY_CONDITION;
 344                lapb_check_need_response(lapb, frame->cr, frame->pf);
 345                if (lapb_validate_nr(lapb, frame->nr)) {
 346                        lapb_check_iframes_acked(lapb, frame->nr);
 347                } else {
 348                        lapb->frmr_data = *frame;
 349                        lapb->frmr_type = LAPB_FRMR_Z;
 350                        lapb_transmit_frmr(lapb);
 351                        lapb_dbg(0, "(%p) S3 -> S4\n", lapb->dev);
 352                        lapb_start_t1timer(lapb);
 353                        lapb_stop_t2timer(lapb);
 354                        lapb->state   = LAPB_STATE_4;
 355                        lapb->n2count = 0;
 356                }
 357                break;
 358
 359        case LAPB_REJ:
 360                lapb_dbg(1, "(%p) S3 RX REJ(%d) R%d\n",
 361                         lapb->dev, frame->pf, frame->nr);
 362                lapb->condition &= ~LAPB_PEER_RX_BUSY_CONDITION;
 363                lapb_check_need_response(lapb, frame->cr, frame->pf);
 364                if (lapb_validate_nr(lapb, frame->nr)) {
 365                        lapb_frames_acked(lapb, frame->nr);
 366                        lapb_stop_t1timer(lapb);
 367                        lapb->n2count = 0;
 368                        lapb_requeue_frames(lapb);
 369                } else {
 370                        lapb->frmr_data = *frame;
 371                        lapb->frmr_type = LAPB_FRMR_Z;
 372                        lapb_transmit_frmr(lapb);
 373                        lapb_dbg(0, "(%p) S3 -> S4\n", lapb->dev);
 374                        lapb_start_t1timer(lapb);
 375                        lapb_stop_t2timer(lapb);
 376                        lapb->state   = LAPB_STATE_4;
 377                        lapb->n2count = 0;
 378                }
 379                break;
 380
 381        case LAPB_I:
 382                lapb_dbg(1, "(%p) S3 RX I(%d) S%d R%d\n",
 383                         lapb->dev, frame->pf, frame->ns, frame->nr);
 384                if (!lapb_validate_nr(lapb, frame->nr)) {
 385                        lapb->frmr_data = *frame;
 386                        lapb->frmr_type = LAPB_FRMR_Z;
 387                        lapb_transmit_frmr(lapb);
 388                        lapb_dbg(0, "(%p) S3 -> S4\n", lapb->dev);
 389                        lapb_start_t1timer(lapb);
 390                        lapb_stop_t2timer(lapb);
 391                        lapb->state   = LAPB_STATE_4;
 392                        lapb->n2count = 0;
 393                        break;
 394                }
 395                if (lapb->condition & LAPB_PEER_RX_BUSY_CONDITION)
 396                        lapb_frames_acked(lapb, frame->nr);
 397                else
 398                        lapb_check_iframes_acked(lapb, frame->nr);
 399
 400                if (frame->ns == lapb->vr) {
 401                        int cn;
 402                        cn = lapb_data_indication(lapb, skb);
 403                        queued = 1;
 404                        /*
 405                         * If upper layer has dropped the frame, we
 406                         * basically ignore any further protocol
 407                         * processing. This will cause the peer
 408                         * to re-transmit the frame later like
 409                         * a frame lost on the wire.
 410                         */
 411                        if (cn == NET_RX_DROP) {
 412                                pr_debug("rx congestion\n");
 413                                break;
 414                        }
 415                        lapb->vr = (lapb->vr + 1) % modulus;
 416                        lapb->condition &= ~LAPB_REJECT_CONDITION;
 417                        if (frame->pf)
 418                                lapb_enquiry_response(lapb);
 419                        else {
 420                                if (!(lapb->condition &
 421                                      LAPB_ACK_PENDING_CONDITION)) {
 422                                        lapb->condition |= LAPB_ACK_PENDING_CONDITION;
 423                                        lapb_start_t2timer(lapb);
 424                                }
 425                        }
 426                } else {
 427                        if (lapb->condition & LAPB_REJECT_CONDITION) {
 428                                if (frame->pf)
 429                                        lapb_enquiry_response(lapb);
 430                        } else {
 431                                lapb_dbg(1, "(%p) S3 TX REJ(%d) R%d\n",
 432                                         lapb->dev, frame->pf, lapb->vr);
 433                                lapb->condition |= LAPB_REJECT_CONDITION;
 434                                lapb_send_control(lapb, LAPB_REJ, frame->pf,
 435                                                  LAPB_RESPONSE);
 436                                lapb->condition &= ~LAPB_ACK_PENDING_CONDITION;
 437                        }
 438                }
 439                break;
 440
 441        case LAPB_FRMR:
 442                lapb_dbg(1, "(%p) S3 RX FRMR(%d) %5ph\n",
 443                         lapb->dev, frame->pf,
 444                         skb->data);
 445                lapb_establish_data_link(lapb);
 446                lapb_dbg(0, "(%p) S3 -> S1\n", lapb->dev);
 447                lapb_requeue_frames(lapb);
 448                lapb->state = LAPB_STATE_1;
 449                break;
 450
 451        case LAPB_ILLEGAL:
 452                lapb_dbg(1, "(%p) S3 RX ILLEGAL(%d)\n", lapb->dev, frame->pf);
 453                lapb->frmr_data = *frame;
 454                lapb->frmr_type = LAPB_FRMR_W;
 455                lapb_transmit_frmr(lapb);
 456                lapb_dbg(0, "(%p) S3 -> S4\n", lapb->dev);
 457                lapb_start_t1timer(lapb);
 458                lapb_stop_t2timer(lapb);
 459                lapb->state   = LAPB_STATE_4;
 460                lapb->n2count = 0;
 461                break;
 462        }
 463
 464        if (!queued)
 465                kfree_skb(skb);
 466}
 467
 468/*
 469 *      State machine for state 4, Frame Reject State.
 470 *      The handling of the timer(s) is in file lapb_timer.c.
 471 */
 472static void lapb_state4_machine(struct lapb_cb *lapb, struct sk_buff *skb,
 473                                struct lapb_frame *frame)
 474{
 475        switch (frame->type) {
 476        case LAPB_SABM:
 477                lapb_dbg(1, "(%p) S4 RX SABM(%d)\n", lapb->dev, frame->pf);
 478                if (lapb->mode & LAPB_EXTENDED) {
 479                        lapb_dbg(1, "(%p) S4 TX DM(%d)\n",
 480                                 lapb->dev, frame->pf);
 481                        lapb_send_control(lapb, LAPB_DM, frame->pf,
 482                                          LAPB_RESPONSE);
 483                } else {
 484                        lapb_dbg(1, "(%p) S4 TX UA(%d)\n",
 485                                 lapb->dev, frame->pf);
 486                        lapb_dbg(0, "(%p) S4 -> S3\n", lapb->dev);
 487                        lapb_send_control(lapb, LAPB_UA, frame->pf,
 488                                          LAPB_RESPONSE);
 489                        lapb_stop_t1timer(lapb);
 490                        lapb_stop_t2timer(lapb);
 491                        lapb->state     = LAPB_STATE_3;
 492                        lapb->condition = 0x00;
 493                        lapb->n2count   = 0;
 494                        lapb->vs        = 0;
 495                        lapb->vr        = 0;
 496                        lapb->va        = 0;
 497                        lapb_connect_indication(lapb, LAPB_OK);
 498                }
 499                break;
 500
 501        case LAPB_SABME:
 502                lapb_dbg(1, "(%p) S4 RX SABME(%d)\n", lapb->dev, frame->pf);
 503                if (lapb->mode & LAPB_EXTENDED) {
 504                        lapb_dbg(1, "(%p) S4 TX UA(%d)\n",
 505                                 lapb->dev, frame->pf);
 506                        lapb_dbg(0, "(%p) S4 -> S3\n", lapb->dev);
 507                        lapb_send_control(lapb, LAPB_UA, frame->pf,
 508                                          LAPB_RESPONSE);
 509                        lapb_stop_t1timer(lapb);
 510                        lapb_stop_t2timer(lapb);
 511                        lapb->state     = LAPB_STATE_3;
 512                        lapb->condition = 0x00;
 513                        lapb->n2count   = 0;
 514                        lapb->vs        = 0;
 515                        lapb->vr        = 0;
 516                        lapb->va        = 0;
 517                        lapb_connect_indication(lapb, LAPB_OK);
 518                } else {
 519                        lapb_dbg(1, "(%p) S4 TX DM(%d)\n",
 520                                 lapb->dev, frame->pf);
 521                        lapb_send_control(lapb, LAPB_DM, frame->pf,
 522                                          LAPB_RESPONSE);
 523                }
 524                break;
 525        }
 526
 527        kfree_skb(skb);
 528}
 529
 530/*
 531 *      Process an incoming LAPB frame
 532 */
 533void lapb_data_input(struct lapb_cb *lapb, struct sk_buff *skb)
 534{
 535        struct lapb_frame frame;
 536
 537        if (lapb_decode(lapb, skb, &frame) < 0) {
 538                kfree_skb(skb);
 539                return;
 540        }
 541
 542        switch (lapb->state) {
 543        case LAPB_STATE_0:
 544                lapb_state0_machine(lapb, skb, &frame); break;
 545        case LAPB_STATE_1:
 546                lapb_state1_machine(lapb, skb, &frame); break;
 547        case LAPB_STATE_2:
 548                lapb_state2_machine(lapb, skb, &frame); break;
 549        case LAPB_STATE_3:
 550                lapb_state3_machine(lapb, skb, &frame); break;
 551        case LAPB_STATE_4:
 552                lapb_state4_machine(lapb, skb, &frame); break;
 553        }
 554
 555        lapb_kick(lapb);
 556}
 557