]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - sys/i4b/layer2/i4b_sframe.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / sys / i4b / layer2 / i4b_sframe.c
1 /*-
2  * Copyright (c) 1997, 2002 Hellmuth Michaelis. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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
23  * SUCH DAMAGE.
24  */
25
26 /*---------------------------------------------------------------------------
27  *
28  *      i4b_sframe.c - s frame handling routines
29  *      ----------------------------------------
30  *      last edit-date: [Sat Mar  9 17:52:06 2002]
31  *
32  *---------------------------------------------------------------------------*/
33
34 #include <sys/cdefs.h>
35 __FBSDID("$FreeBSD$");
36
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/mbuf.h>
40 #include <sys/socket.h>
41 #include <net/if.h>
42
43 #include <i4b/include/i4b_debug.h>
44
45 #include <i4b/include/i4b_l1l2.h>
46 #include <i4b/include/i4b_mbuf.h>
47
48 #include <i4b/layer2/i4b_l2.h>
49 #include <i4b/layer2/i4b_l2fsm.h>
50
51 /*---------------------------------------------------------------------------*
52  *      process s frame
53  *---------------------------------------------------------------------------*/
54 void
55 i4b_rxd_s_frame(int unit, struct mbuf *m)
56 {
57         l2_softc_t *l2sc = &l2_softc[unit];
58         u_char *ptr = m->m_data;
59         
60         if(!((l2sc->tei_valid == TEI_VALID) &&
61              (l2sc->tei == GETTEI(*(ptr+OFF_TEI)))))
62         {
63                 i4b_Dfreembuf(m);
64                 return;
65         }
66
67         l2sc->rxd_CR = GETCR(*(ptr + OFF_SAPI));
68         l2sc->rxd_PF = GETSPF(*(ptr + OFF_SNR));
69         l2sc->rxd_NR = GETSNR(*(ptr + OFF_SNR));
70
71         i4b_rxd_ack(l2sc, l2sc->rxd_NR);
72         
73         switch(*(ptr + OFF_SRCR))
74         {
75                 case RR:
76                         l2sc->stat.rx_rr++; /* update statistics */
77                         NDBGL2(L2_S_MSG, "rx'd RR, N(R) = %d", l2sc->rxd_NR);
78                         i4b_next_l2state(l2sc, EV_RXRR);
79                         break;
80
81                 case RNR:
82                         l2sc->stat.rx_rnr++; /* update statistics */
83                         NDBGL2(L2_S_MSG, "rx'd RNR, N(R) = %d", l2sc->rxd_NR);
84                         i4b_next_l2state(l2sc, EV_RXRNR);
85                         break;
86
87                 case REJ:
88                         l2sc->stat.rx_rej++; /* update statistics */
89                         NDBGL2(L2_S_MSG, "rx'd REJ, N(R) = %d", l2sc->rxd_NR);
90                         i4b_next_l2state(l2sc, EV_RXREJ);
91                         break;
92
93                 default:
94                         l2sc->stat.err_rx_bads++; /* update statistics */
95                         NDBGL2(L2_S_ERR, "ERROR, unknown code, frame = ");
96                         i4b_print_frame(m->m_len, m->m_data);
97                         break;
98         }
99         i4b_Dfreembuf(m);       
100 }
101
102 /*---------------------------------------------------------------------------*
103  *      transmit RR command
104  *---------------------------------------------------------------------------*/
105 void
106 i4b_tx_rr_command(l2_softc_t *l2sc, pbit_t pbit)
107 {
108         struct mbuf *m;
109
110         NDBGL2(L2_S_MSG, "tx RR, unit = %d", l2sc->unit);
111
112         m = i4b_build_s_frame(l2sc, CR_CMD_TO_NT, pbit, RR);
113
114         PH_Data_Req(l2sc->unit, m, MBUF_FREE);
115
116         l2sc->stat.tx_rr++; /* update statistics */
117 }
118
119 /*---------------------------------------------------------------------------*
120  *      transmit RR response
121  *---------------------------------------------------------------------------*/
122 void
123 i4b_tx_rr_response(l2_softc_t *l2sc, fbit_t fbit)
124 {
125         struct mbuf *m;
126
127         NDBGL2(L2_S_MSG, "tx RR, unit = %d", l2sc->unit);
128
129         m = i4b_build_s_frame(l2sc, CR_RSP_TO_NT, fbit, RR);    
130
131         PH_Data_Req(l2sc->unit, m, MBUF_FREE);
132
133         l2sc->stat.tx_rr++; /* update statistics */
134 }
135
136 /*---------------------------------------------------------------------------*
137  *      transmit RNR command
138  *---------------------------------------------------------------------------*/
139 void
140 i4b_tx_rnr_command(l2_softc_t *l2sc, pbit_t pbit)
141 {
142         struct mbuf *m;
143
144         NDBGL2(L2_S_MSG, "tx RNR, unit = %d", l2sc->unit);
145
146         m = i4b_build_s_frame(l2sc, CR_CMD_TO_NT, pbit, RNR);   
147
148         PH_Data_Req(l2sc->unit, m, MBUF_FREE);
149
150         l2sc->stat.tx_rnr++; /* update statistics */
151 }
152
153 /*---------------------------------------------------------------------------*
154  *      transmit RNR response
155  *---------------------------------------------------------------------------*/
156 void
157 i4b_tx_rnr_response(l2_softc_t *l2sc, fbit_t fbit)
158 {
159         struct mbuf *m;
160
161         NDBGL2(L2_S_MSG, "tx RNR, unit = %d", l2sc->unit);
162
163         m = i4b_build_s_frame(l2sc, CR_RSP_TO_NT, fbit, RNR);
164
165         PH_Data_Req(l2sc->unit, m, MBUF_FREE);
166
167         l2sc->stat.tx_rnr++; /* update statistics */
168 }
169
170 /*---------------------------------------------------------------------------*
171  *      transmit REJ response
172  *---------------------------------------------------------------------------*/
173 void
174 i4b_tx_rej_response(l2_softc_t *l2sc, fbit_t fbit)
175 {
176         struct mbuf *m;
177
178         NDBGL2(L2_S_MSG, "tx REJ, unit = %d", l2sc->unit);
179
180         m = i4b_build_s_frame(l2sc, CR_RSP_TO_NT, fbit, REJ);
181
182         PH_Data_Req(l2sc->unit, m, MBUF_FREE);
183
184         l2sc->stat.tx_rej++; /* update statistics */    
185 }
186
187 /*---------------------------------------------------------------------------*
188  *      build S-frame for sending
189  *---------------------------------------------------------------------------*/
190 struct mbuf *
191 i4b_build_s_frame(l2_softc_t *l2sc, crbit_to_nt_t crbit, pbit_t pbit, u_char type)
192 {
193         struct mbuf *m;
194         
195         if((m = i4b_Dgetmbuf(S_FRAME_LEN)) == NULL)
196                 return(NULL);
197
198         PUTSAPI(SAPI_CCP, crbit, m->m_data[OFF_SAPI]);
199                 
200         PUTTEI(l2sc->tei, m->m_data[OFF_TEI]);
201
202         m->m_data[OFF_SRCR] = type;
203
204         m->m_data[OFF_SNR] = (l2sc->vr << 1) | (pbit & 0x01);
205
206         return(m);
207 }