2 * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 *---------------------------------------------------------------------------
27 * i4b_sframe.c - s frame handling routines
28 * ----------------------------------------
30 * $Id: i4b_sframe.c,v 1.8 2005/12/11 12:25:06 christos Exp $
34 * last edit-date: [Fri Jan 5 11:33:47 2001]
36 *---------------------------------------------------------------------------*/
38 #include <sys/cdefs.h>
39 __KERNEL_RCSID(0, "$NetBSD: i4b_sframe.c,v 1.5.8.4 2005/03/04 16:53:46 skrll Exp $");
48 #include <sys/param.h>
49 #include <sys/kernel.h>
50 #include <sys/systm.h>
52 #include <sys/socket.h>
55 #if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000
56 #include <sys/callout.h>
60 #include <machine/i4b_debug.h>
61 #include <machine/i4b_ioctl.h>
63 #include <netisdn/i4b_debug.h>
64 #include <netisdn/i4b_ioctl.h>
67 #include <netisdn/i4b_l2.h>
68 #include <netisdn/i4b_l1l2.h>
69 #include <netisdn/i4b_isdnq931.h>
70 #include <netisdn/i4b_mbuf.h>
71 #include <netisdn/i4b_l2fsm.h>
72 #include <netisdn/i4b_l3l4.h>
74 /*---------------------------------------------------------------------------*
76 *---------------------------------------------------------------------------*/
78 i4b_rxd_s_frame(l2_softc_t
*l2sc
, struct isdn_l3_driver
*drv
, struct mbuf
*m
)
80 u_char
*ptr
= m
->m_data
;
82 if(!((l2sc
->tei_valid
== TEI_VALID
) &&
83 (l2sc
->tei
== GETTEI(*(ptr
+OFF_TEI
)))))
89 l2sc
->rxd_CR
= GETCR(*(ptr
+ OFF_SAPI
));
90 l2sc
->rxd_PF
= GETSPF(*(ptr
+ OFF_SNR
));
91 l2sc
->rxd_NR
= GETSNR(*(ptr
+ OFF_SNR
));
93 i4b_rxd_ack(l2sc
, drv
, l2sc
->rxd_NR
);
95 switch(*(ptr
+ OFF_SRCR
))
98 l2sc
->stat
.rx_rr
++; /* update statistics */
99 NDBGL2(L2_S_MSG
, "rx'd RR, N(R) = %d", l2sc
->rxd_NR
);
100 i4b_next_l2state(l2sc
, drv
, EV_RXRR
);
104 l2sc
->stat
.rx_rnr
++; /* update statistics */
105 NDBGL2(L2_S_MSG
, "rx'd RNR, N(R) = %d", l2sc
->rxd_NR
);
106 i4b_next_l2state(l2sc
, drv
, EV_RXRNR
);
110 l2sc
->stat
.rx_rej
++; /* update statistics */
111 NDBGL2(L2_S_MSG
, "rx'd REJ, N(R) = %d", l2sc
->rxd_NR
);
112 i4b_next_l2state(l2sc
, drv
, EV_RXREJ
);
116 l2sc
->stat
.err_rx_bads
++; /* update statistics */
117 NDBGL2(L2_S_ERR
, "ERROR, unknown code, frame = ");
118 i4b_print_frame(m
->m_len
, m
->m_data
);
124 /*---------------------------------------------------------------------------*
125 * transmit RR command
126 *---------------------------------------------------------------------------*/
128 i4b_tx_rr_command(l2_softc_t
*l2sc
, pbit_t pbit
)
132 NDBGL2(L2_S_MSG
, "tx RR, isdnif = %d", l2sc
->drv
->isdnif
);
134 m
= i4b_build_s_frame(l2sc
, CR_CMD_TO_NT
, pbit
, RR
);
136 l2sc
->driver
->ph_data_req(l2sc
->l1_token
, m
, MBUF_FREE
);
138 l2sc
->stat
.tx_rr
++; /* update statistics */
141 /*---------------------------------------------------------------------------*
142 * transmit RR response
143 *---------------------------------------------------------------------------*/
145 i4b_tx_rr_response(l2_softc_t
*l2sc
, fbit_t fbit
)
149 NDBGL2(L2_S_MSG
, "tx RR, isdnif = %d", l2sc
->drv
->isdnif
);
151 m
= i4b_build_s_frame(l2sc
, CR_RSP_TO_NT
, fbit
, RR
);
153 l2sc
->driver
->ph_data_req(l2sc
->l1_token
, m
, MBUF_FREE
);
155 l2sc
->stat
.tx_rr
++; /* update statistics */
158 /*---------------------------------------------------------------------------*
159 * transmit RNR command
160 *---------------------------------------------------------------------------*/
162 i4b_tx_rnr_command(l2_softc_t
*l2sc
, pbit_t pbit
)
166 NDBGL2(L2_S_MSG
, "tx RNR, isdnif = %d", l2sc
->drv
->isdnif
);
168 m
= i4b_build_s_frame(l2sc
, CR_CMD_TO_NT
, pbit
, RNR
);
170 l2sc
->driver
->ph_data_req(l2sc
->l1_token
, m
, MBUF_FREE
);
172 l2sc
->stat
.tx_rnr
++; /* update statistics */
175 /*---------------------------------------------------------------------------*
176 * transmit RNR response
177 *---------------------------------------------------------------------------*/
179 i4b_tx_rnr_response(l2_softc_t
*l2sc
, fbit_t fbit
)
183 NDBGL2(L2_S_MSG
, "tx RNR, isdnif = %d", l2sc
->drv
->isdnif
);
185 m
= i4b_build_s_frame(l2sc
, CR_RSP_TO_NT
, fbit
, RNR
);
187 l2sc
->driver
->ph_data_req(l2sc
->l1_token
, m
, MBUF_FREE
);
189 l2sc
->stat
.tx_rnr
++; /* update statistics */
192 /*---------------------------------------------------------------------------*
193 * transmit REJ response
194 *---------------------------------------------------------------------------*/
196 i4b_tx_rej_response(l2_softc_t
*l2sc
, fbit_t fbit
)
200 NDBGL2(L2_S_MSG
, "tx REJ, isdnif = %d", l2sc
->drv
->isdnif
);
202 m
= i4b_build_s_frame(l2sc
, CR_RSP_TO_NT
, fbit
, REJ
);
204 l2sc
->driver
->ph_data_req(l2sc
->l1_token
, m
, MBUF_FREE
);
206 l2sc
->stat
.tx_rej
++; /* update statistics */
209 /*---------------------------------------------------------------------------*
210 * build S-frame for sending
211 *---------------------------------------------------------------------------*/
213 i4b_build_s_frame(l2_softc_t
*l2sc
, crbit_to_nt_t crbit
, pbit_t pbit
, u_char type
)
217 if((m
= i4b_Dgetmbuf(S_FRAME_LEN
)) == NULL
)
220 PUTSAPI(SAPI_CCP
, crbit
, m
->m_data
[OFF_SAPI
]);
222 PUTTEI(l2sc
->tei
, m
->m_data
[OFF_TEI
]);
224 m
->m_data
[OFF_SRCR
] = type
;
226 m
->m_data
[OFF_SNR
] = (l2sc
->vr
<< 1) | (pbit
& 0x01);
231 #endif /* NI4BQ921 > 0 */