linux/include/net/lapb.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LAPB_H
   3#define _LAPB_H 
   4#include <linux/lapb.h>
   5#include <linux/refcount.h>
   6
   7#define LAPB_HEADER_LEN 20              /* LAPB over Ethernet + a bit more */
   8
   9#define LAPB_ACK_PENDING_CONDITION      0x01
  10#define LAPB_REJECT_CONDITION           0x02
  11#define LAPB_PEER_RX_BUSY_CONDITION     0x04
  12
  13/* Control field templates */
  14#define LAPB_I          0x00    /* Information frames */
  15#define LAPB_S          0x01    /* Supervisory frames */
  16#define LAPB_U          0x03    /* Unnumbered frames */
  17
  18#define LAPB_RR         0x01    /* Receiver ready */
  19#define LAPB_RNR        0x05    /* Receiver not ready */
  20#define LAPB_REJ        0x09    /* Reject */
  21
  22#define LAPB_SABM       0x2F    /* Set Asynchronous Balanced Mode */
  23#define LAPB_SABME      0x6F    /* Set Asynchronous Balanced Mode Extended */
  24#define LAPB_DISC       0x43    /* Disconnect */
  25#define LAPB_DM         0x0F    /* Disconnected mode */
  26#define LAPB_UA         0x63    /* Unnumbered acknowledge */
  27#define LAPB_FRMR       0x87    /* Frame reject */
  28
  29#define LAPB_ILLEGAL    0x100   /* Impossible to be a real frame type */
  30
  31#define LAPB_SPF        0x10    /* Poll/final bit for standard LAPB */
  32#define LAPB_EPF        0x01    /* Poll/final bit for extended LAPB */
  33
  34#define LAPB_FRMR_W     0x01    /* Control field invalid        */
  35#define LAPB_FRMR_X     0x02    /* I field invalid              */
  36#define LAPB_FRMR_Y     0x04    /* I field too long             */
  37#define LAPB_FRMR_Z     0x08    /* Invalid N(R)                 */
  38
  39#define LAPB_POLLOFF    0
  40#define LAPB_POLLON     1
  41
  42/* LAPB C-bit */
  43#define LAPB_COMMAND    1
  44#define LAPB_RESPONSE   2
  45
  46#define LAPB_ADDR_A     0x03
  47#define LAPB_ADDR_B     0x01
  48#define LAPB_ADDR_C     0x0F
  49#define LAPB_ADDR_D     0x07
  50
  51/* Define Link State constants. */
  52enum {
  53        LAPB_STATE_0,   /* Disconnected State           */
  54        LAPB_STATE_1,   /* Awaiting Connection State    */
  55        LAPB_STATE_2,   /* Awaiting Disconnection State */
  56        LAPB_STATE_3,   /* Data Transfer State          */
  57        LAPB_STATE_4    /* Frame Reject State           */
  58};
  59
  60#define LAPB_DEFAULT_MODE               (LAPB_STANDARD | LAPB_SLP | LAPB_DTE)
  61#define LAPB_DEFAULT_WINDOW             7               /* Window=7 */
  62#define LAPB_DEFAULT_T1                 (5 * HZ)        /* T1=5s    */
  63#define LAPB_DEFAULT_T2                 (1 * HZ)        /* T2=1s    */
  64#define LAPB_DEFAULT_N2                 20              /* N2=20    */
  65
  66#define LAPB_SMODULUS   8
  67#define LAPB_EMODULUS   128
  68
  69/*
  70 *      Information about the current frame.
  71 */
  72struct lapb_frame {
  73        unsigned short          type;           /* Parsed type          */
  74        unsigned short          nr, ns;         /* N(R), N(S)           */
  75        unsigned char           cr;             /* Command/Response     */
  76        unsigned char           pf;             /* Poll/Final           */
  77        unsigned char           control[2];     /* Original control data*/
  78};
  79
  80/*
  81 *      The per LAPB connection control structure.
  82 */
  83struct lapb_cb {
  84        struct list_head        node;
  85        struct net_device       *dev;
  86
  87        /* Link status fields */
  88        unsigned int            mode;
  89        unsigned char           state;
  90        unsigned short          vs, vr, va;
  91        unsigned char           condition;
  92        unsigned short          n2, n2count;
  93        unsigned short          t1, t2;
  94        struct timer_list       t1timer, t2timer;
  95        bool                    t1timer_running, t2timer_running;
  96
  97        /* Internal control information */
  98        struct sk_buff_head     write_queue;
  99        struct sk_buff_head     ack_queue;
 100        unsigned char           window;
 101        const struct lapb_register_struct *callbacks;
 102
 103        /* FRMR control information */
 104        struct lapb_frame       frmr_data;
 105        unsigned char           frmr_type;
 106
 107        spinlock_t              lock;
 108        refcount_t              refcnt;
 109};
 110
 111/* lapb_iface.c */
 112void lapb_connect_confirmation(struct lapb_cb *lapb, int);
 113void lapb_connect_indication(struct lapb_cb *lapb, int);
 114void lapb_disconnect_confirmation(struct lapb_cb *lapb, int);
 115void lapb_disconnect_indication(struct lapb_cb *lapb, int);
 116int lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *);
 117int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *);
 118
 119/* lapb_in.c */
 120void lapb_data_input(struct lapb_cb *lapb, struct sk_buff *);
 121
 122/* lapb_out.c */
 123void lapb_kick(struct lapb_cb *lapb);
 124void lapb_transmit_buffer(struct lapb_cb *lapb, struct sk_buff *, int);
 125void lapb_establish_data_link(struct lapb_cb *lapb);
 126void lapb_enquiry_response(struct lapb_cb *lapb);
 127void lapb_timeout_response(struct lapb_cb *lapb);
 128void lapb_check_iframes_acked(struct lapb_cb *lapb, unsigned short);
 129void lapb_check_need_response(struct lapb_cb *lapb, int, int);
 130
 131/* lapb_subr.c */
 132void lapb_clear_queues(struct lapb_cb *lapb);
 133void lapb_frames_acked(struct lapb_cb *lapb, unsigned short);
 134void lapb_requeue_frames(struct lapb_cb *lapb);
 135int lapb_validate_nr(struct lapb_cb *lapb, unsigned short);
 136int lapb_decode(struct lapb_cb *lapb, struct sk_buff *, struct lapb_frame *);
 137void lapb_send_control(struct lapb_cb *lapb, int, int, int);
 138void lapb_transmit_frmr(struct lapb_cb *lapb);
 139
 140/* lapb_timer.c */
 141void lapb_start_t1timer(struct lapb_cb *lapb);
 142void lapb_start_t2timer(struct lapb_cb *lapb);
 143void lapb_stop_t1timer(struct lapb_cb *lapb);
 144void lapb_stop_t2timer(struct lapb_cb *lapb);
 145int lapb_t1timer_running(struct lapb_cb *lapb);
 146
 147/*
 148 * Debug levels.
 149 *      0 = Off
 150 *      1 = State Changes
 151 *      2 = Packets I/O and State Changes
 152 *      3 = Hex dumps, Packets I/O and State Changes.
 153 */
 154#define LAPB_DEBUG      0
 155
 156#define lapb_dbg(level, fmt, ...)                       \
 157do {                                                    \
 158        if (level < LAPB_DEBUG)                         \
 159                pr_debug(fmt, ##__VA_ARGS__);           \
 160} while (0)
 161
 162#endif
 163