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