1 |
1275 |
phoenix |
#include <linux/skbuff.h>
|
2 |
|
|
|
3 |
|
|
#define LLC_MODULE
|
4 |
|
|
|
5 |
|
|
typedef struct llc_struct llc;
|
6 |
|
|
typedef struct llc_struct *llcptr;
|
7 |
|
|
|
8 |
|
|
/*
|
9 |
|
|
* LLC private data area structure.
|
10 |
|
|
*/
|
11 |
|
|
|
12 |
|
|
struct llc_struct
|
13 |
|
|
{
|
14 |
|
|
char eye[4]; /* To recognize llc area in dump */
|
15 |
|
|
int retry_count; /* LLC link state variables */
|
16 |
|
|
unsigned char name[9]; /* name of this llc instance */
|
17 |
|
|
unsigned char s_flag;
|
18 |
|
|
unsigned char p_flag;
|
19 |
|
|
unsigned char f_flag;
|
20 |
|
|
unsigned char data_flag;
|
21 |
|
|
unsigned char cause_flag;
|
22 |
|
|
unsigned char vs; /* Send state variable */
|
23 |
|
|
unsigned char vr; /* Receive state variable */
|
24 |
|
|
unsigned char remote_busy;
|
25 |
|
|
unsigned char state; /* Current state of type2 llc procedure */
|
26 |
|
|
int n1; /* Maximum number of bytes in I pdu 7.8.2 */
|
27 |
|
|
int n2; /* Naximum number of retransmissions 7.8.2 */
|
28 |
|
|
unsigned char k; /* Transmit window size 7.8.4, tw in IBM doc*/
|
29 |
|
|
unsigned char rw; /* Receive window size */
|
30 |
|
|
struct
|
31 |
|
|
{
|
32 |
|
|
/*
|
33 |
|
|
* FRMR_RSP info field structure: 5.4.2.3.5 p55
|
34 |
|
|
*/
|
35 |
|
|
|
36 |
|
|
unsigned char cntl1;
|
37 |
|
|
unsigned char cntl2;
|
38 |
|
|
unsigned char vs;
|
39 |
|
|
unsigned char vr_cr;
|
40 |
|
|
unsigned char xxyz;
|
41 |
|
|
} frmr_info_fld;
|
42 |
|
|
|
43 |
|
|
/*
|
44 |
|
|
* Timers in 7.8.1 page 78
|
45 |
|
|
*/
|
46 |
|
|
|
47 |
|
|
#define P_TIMER 0
|
48 |
|
|
#define REJ_TIMER 1
|
49 |
|
|
#define ACK_TIMER 2
|
50 |
|
|
#define BUSY_TIMER 3
|
51 |
|
|
unsigned long timer_expire_time[4];
|
52 |
|
|
unsigned char timer_state[4]; /* The state of each timer */
|
53 |
|
|
#define TIMER_IDLE 0
|
54 |
|
|
#define TIMER_RUNNING 1
|
55 |
|
|
#define TIMER_EXPIRED 2
|
56 |
|
|
unsigned long timer_interval[4];
|
57 |
|
|
struct timer_list tl[4];
|
58 |
|
|
|
59 |
|
|
/*
|
60 |
|
|
* Client entry point, called by the LLC.
|
61 |
|
|
*/
|
62 |
|
|
|
63 |
|
|
void (*llc_event)(struct llc_struct *);
|
64 |
|
|
|
65 |
|
|
/*
|
66 |
|
|
* Mux and Demux variables
|
67 |
|
|
*/
|
68 |
|
|
|
69 |
|
|
char * client_data; /* Pointer to clients context */
|
70 |
|
|
unsigned char local_sap;
|
71 |
|
|
unsigned char remote_sap ;
|
72 |
|
|
char remote_mac[MAX_ADDR_LEN]; /* MAC address of remote session partner */
|
73 |
|
|
struct net_device *dev; /* Device we are attached to */
|
74 |
|
|
|
75 |
|
|
unsigned char llc_mode; /* See doc 7.1 on p70 */
|
76 |
|
|
#define MODE_ADM 1
|
77 |
|
|
#define MODE_ABM 2
|
78 |
|
|
|
79 |
|
|
int llc_callbacks; /* Pending callbacks */
|
80 |
|
|
#define LLC_CONN_INDICATION 1 /* We have to ensure the names don't */
|
81 |
|
|
#define LLC_CONN_CONFIRM 2 /* mix up with the 802 state table */
|
82 |
|
|
#define LLC_DATA_INDIC 4
|
83 |
|
|
#define LLC_DISC_INDICATION 8
|
84 |
|
|
#define LLC_RESET_INDIC_LOC 16
|
85 |
|
|
#define LLC_RESET_INDIC_REM 32
|
86 |
|
|
#define LLC_RST_CONFIRM 64
|
87 |
|
|
#define LLC_FRMR_RECV 128
|
88 |
|
|
#define LLC_FRMR_SENT 256
|
89 |
|
|
#define LLC_REMOTE_BUSY 512
|
90 |
|
|
#define LLC_REMOTE_NOTBUSY 1024
|
91 |
|
|
#define LLC_TEST_INDICATION 2048
|
92 |
|
|
#define LLC_XID_INDICATION 4096
|
93 |
|
|
#define LLC_UI_DATA 8192
|
94 |
|
|
|
95 |
|
|
struct sk_buff *inc_skb; /* Saved data buffer for indications */
|
96 |
|
|
|
97 |
|
|
struct sk_buff_head rtq; /* Retransmit queue */
|
98 |
|
|
struct sk_buff_head atq; /* Await transit queue */
|
99 |
|
|
|
100 |
|
|
unsigned char xid_count;
|
101 |
|
|
|
102 |
|
|
struct llc_struct *nextllc; /* ptr to next llc struct in proto chain */
|
103 |
|
|
};
|
104 |
|
|
|
105 |
|
|
#define ADD_TO_RTQ(skb) skb_queue_tail(&lp->rtq,skb)
|
106 |
|
|
#define ADD_TO_ATQ(skb) skb_queue_tail(&lp->atq,skb)
|
107 |
|
|
|
108 |
|
|
void llc_cancel_timers(llcptr lp);
|
109 |
|
|
int llc_decode_frametype(frameptr fr);
|
110 |
|
|
llcptr llc_find(void);
|
111 |
|
|
int llc_free_acknowledged_skbs(llcptr lp, unsigned char ack);
|
112 |
|
|
void llc_handle_xid_indication( char *chsp, short int ll, char *xid_data);
|
113 |
|
|
void llc_interpret_pseudo_code(llcptr lp, int pc_label, struct sk_buff *skb, char type);
|
114 |
|
|
void llc_add_to_queue(struct sk_buff *skb, struct sk_buff **f, struct sk_buff **b);
|
115 |
|
|
void llc_process_otype2_frame(llcptr lp, struct sk_buff *skb, char type);
|
116 |
|
|
struct sk_buff *llc_pull_from_atq(llcptr lp);
|
117 |
|
|
int llc_resend_ipdu(llcptr lp, unsigned char ack_nr, unsigned char type, char p);
|
118 |
|
|
void llc_sendpdu(llcptr lp, char type, char pf, int data_len, char *pdu_data);
|
119 |
|
|
void llc_sendipdu(llcptr lp, char type, char pf, struct sk_buff *skb);
|
120 |
|
|
void llc_start_timer(llcptr lp, int t);
|
121 |
|
|
void llc_stop_timer(llcptr lp, int t);
|
122 |
|
|
void llc_timer_expired(llcptr lp, int t);
|
123 |
|
|
int llc_validate_seq_nos(llcptr lp, frameptr fr);
|
124 |
|
|
|
125 |
|
|
int llc_data_request(llcptr lp, struct sk_buff *skb);
|
126 |
|
|
void llc_unit_data_request(llcptr lp, int ll, char * data);
|
127 |
|
|
void llc_disconnect_request(llcptr lp);
|
128 |
|
|
void llc_connect_request(llcptr lp);
|
129 |
|
|
void llc_xid_request(llcptr lp, char opt, int data_len, char *pdu_data);
|
130 |
|
|
void llc_test_request(llcptr lp, int data_len, char *pdu_data);
|
131 |
|
|
|
132 |
|
|
int register_cl2llc_client(llcptr llc, const char *device, void (*ops)(llcptr), u8 *rmac, u8 ssap, u8 dsap);
|
133 |
|
|
void unregister_cl2llc_client(llcptr lp);
|
134 |
|
|
int llc_mac_data_indicate(llcptr lp, struct sk_buff *skb );
|
135 |
|
|
|