^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #ifndef LLC_CONN_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #define LLC_CONN_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 1997 by Procom Technology, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * 2001, 2002 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * This program can be redistributed or modified under the terms of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * GNU General Public License as published by the Free Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * This program is distributed without any warranty or implied warranty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * of merchantability or fitness for a particular purpose.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * See the GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <net/llc_if.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <net/sock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/llc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define LLC_EVENT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define LLC_PACKET 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define LLC2_P_TIME 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define LLC2_ACK_TIME 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define LLC2_REJ_TIME 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define LLC2_BUSY_TIME 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct llc_timer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct timer_list timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) unsigned long expire; /* timer expire time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct llc_sock {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /* struct sock must be the first member of llc_sock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct sock sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct sockaddr_llc addr; /* address sock is bound to */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) u8 state; /* state of connection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct llc_sap *sap; /* pointer to parent SAP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct llc_addr laddr; /* lsap/mac pair */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct llc_addr daddr; /* dsap/mac pair */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct net_device *dev; /* device to send to remote */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) u32 copied_seq; /* head of yet unread data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) u8 retry_count; /* number of retries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u8 ack_must_be_send;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u8 first_pdu_Ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) u8 npta;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) struct llc_timer ack_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct llc_timer pf_cycle_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct llc_timer rej_sent_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct llc_timer busy_state_timer; /* ind busy clr at remote LLC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) u8 vS; /* seq# next in-seq I-PDU tx'd*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) u8 vR; /* seq# next in-seq I-PDU rx'd*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) u32 n2; /* max nbr re-tx's for timeout*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) u32 n1; /* max nbr octets in I PDU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) u8 k; /* tx window size; max = 127 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) u8 rw; /* rx window size; max = 127 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) u8 p_flag; /* state flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) u8 f_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) u8 s_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) u8 data_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) u8 remote_busy_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) u8 cause_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct sk_buff_head pdu_unack_q; /* PUDs sent/waiting ack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) u16 link; /* network layer link number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) u8 X; /* a temporary variable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) u8 ack_pf; /* this flag indicates what is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) the P-bit of acknowledge */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) u8 failed_data_req; /* recognize that already exist a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) failed llc_data_req_handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) (tx_buffer_full or unacceptable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) u8 dec_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) u8 inc_cntr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) u8 dec_cntr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) u8 connect_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) u8 last_nr; /* NR of last pdu received */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) u32 rx_pdu_hdr; /* used for saving header of last pdu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) received and caused sending FRMR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) Used for resending FRMR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u32 cmsg_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct hlist_node dev_hash_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) static inline struct llc_sock *llc_sk(const struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) return (struct llc_sock *)sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) static __inline__ void llc_set_backlog_type(struct sk_buff *skb, char type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) skb->cb[sizeof(skb->cb) - 1] = type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) static __inline__ char llc_backlog_type(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return skb->cb[sizeof(skb->cb) - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct sock *llc_sk_alloc(struct net *net, int family, gfp_t priority,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct proto *prot, int kern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) void llc_sk_stop_all_timers(struct sock *sk, bool sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) void llc_sk_free(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) void llc_sk_reset(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* Access to a connection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) int llc_conn_state_process(struct sock *sk, struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) void llc_conn_send_pdu(struct sock *sk, struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) void llc_conn_rtn_pdu(struct sock *sk, struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) void llc_conn_resend_i_pdu_as_cmd(struct sock *sk, u8 nr, u8 first_p_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) void llc_conn_resend_i_pdu_as_rsp(struct sock *sk, u8 nr, u8 first_f_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int llc_conn_remove_acked_pdus(struct sock *conn, u8 nr, u16 *how_many_unacked);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct sock *llc_lookup_established(struct llc_sap *sap, struct llc_addr *daddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct llc_addr *laddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) void llc_sap_add_socket(struct llc_sap *sap, struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) void llc_sap_remove_socket(struct llc_sap *sap, struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u8 llc_data_accept_state(u8 state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) void llc_build_offset_table(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #endif /* LLC_CONN_H */