~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/x25/x25_in.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /net/x25/x25_in.c (Version linux-6.11-rc3) and /net/x25/x25_in.c (Version linux-2.6.32.71)


  1 // SPDX-License-Identifier: GPL-2.0-or-later   << 
  2 /*                                                  1 /*
  3  *      X.25 Packet Layer release 002               2  *      X.25 Packet Layer release 002
  4  *                                                  3  *
  5  *      This is ALPHA test software. This code      4  *      This is ALPHA test software. This code may break your machine,
  6  *      randomly fail to work with new release      5  *      randomly fail to work with new releases, misbehave and/or generally
  7  *      screw up. It might even work.               6  *      screw up. It might even work.
  8  *                                                  7  *
  9  *      This code REQUIRES 2.1.15 or higher         8  *      This code REQUIRES 2.1.15 or higher
 10  *                                                  9  *
                                                   >>  10  *      This module:
                                                   >>  11  *              This module is free software; you can redistribute it and/or
                                                   >>  12  *              modify it under the terms of the GNU General Public License
                                                   >>  13  *              as published by the Free Software Foundation; either version
                                                   >>  14  *              2 of the License, or (at your option) any later version.
                                                   >>  15  *
 11  *      History                                    16  *      History
 12  *      X.25 001        Jonathan Naylor   Star     17  *      X.25 001        Jonathan Naylor   Started coding.
 13  *      X.25 002        Jonathan Naylor   Cent     18  *      X.25 002        Jonathan Naylor   Centralised disconnection code.
 14  *                                        New      19  *                                        New timer architecture.
 15  *      2000-03-20      Daniela Squassoni Disa     20  *      2000-03-20      Daniela Squassoni Disabling/enabling of facilities
 16  *                                        nego     21  *                                        negotiation.
 17  *      2000-11-10      Henner Eisen      Chec     22  *      2000-11-10      Henner Eisen      Check and reset for out-of-sequence
 18  *                                        i-fr     23  *                                        i-frames.
 19  */                                                24  */
 20                                                    25 
 21 #define pr_fmt(fmt) "X25: " fmt                << 
 22                                                << 
 23 #include <linux/slab.h>                        << 
 24 #include <linux/errno.h>                           26 #include <linux/errno.h>
 25 #include <linux/kernel.h>                          27 #include <linux/kernel.h>
 26 #include <linux/string.h>                          28 #include <linux/string.h>
 27 #include <linux/skbuff.h>                          29 #include <linux/skbuff.h>
 28 #include <net/sock.h>                              30 #include <net/sock.h>
 29 #include <net/tcp_states.h>                        31 #include <net/tcp_states.h>
 30 #include <net/x25.h>                               32 #include <net/x25.h>
 31                                                    33 
 32 static int x25_queue_rx_frame(struct sock *sk,     34 static int x25_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more)
 33 {                                                  35 {
 34         struct sk_buff *skbo, *skbn = skb;         36         struct sk_buff *skbo, *skbn = skb;
 35         struct x25_sock *x25 = x25_sk(sk);         37         struct x25_sock *x25 = x25_sk(sk);
 36                                                    38 
 37         if (more) {                                39         if (more) {
 38                 x25->fraglen += skb->len;          40                 x25->fraglen += skb->len;
 39                 skb_queue_tail(&x25->fragment_     41                 skb_queue_tail(&x25->fragment_queue, skb);
 40                 skb_set_owner_r(skb, sk);          42                 skb_set_owner_r(skb, sk);
 41                 return 0;                          43                 return 0;
 42         }                                          44         }
 43                                                    45 
 44         if (x25->fraglen > 0) { /* End of frag !!  46         if (!more && x25->fraglen > 0) {        /* End of fragment */
 45                 int len = x25->fraglen + skb->     47                 int len = x25->fraglen + skb->len;
 46                                                    48 
 47                 if ((skbn = alloc_skb(len, GFP     49                 if ((skbn = alloc_skb(len, GFP_ATOMIC)) == NULL){
 48                         kfree_skb(skb);            50                         kfree_skb(skb);
 49                         return 1;                  51                         return 1;
 50                 }                                  52                 }
 51                                                    53 
 52                 skb_queue_tail(&x25->fragment_     54                 skb_queue_tail(&x25->fragment_queue, skb);
 53                                                    55 
 54                 skb_reset_transport_header(skb     56                 skb_reset_transport_header(skbn);
 55                                                    57 
 56                 skbo = skb_dequeue(&x25->fragm     58                 skbo = skb_dequeue(&x25->fragment_queue);
 57                 skb_copy_from_linear_data(skbo     59                 skb_copy_from_linear_data(skbo, skb_put(skbn, skbo->len),
 58                                           skbo     60                                           skbo->len);
 59                 kfree_skb(skbo);                   61                 kfree_skb(skbo);
 60                                                    62 
 61                 while ((skbo =                     63                 while ((skbo =
 62                         skb_dequeue(&x25->frag     64                         skb_dequeue(&x25->fragment_queue)) != NULL) {
 63                         skb_pull(skbo, (x25->n     65                         skb_pull(skbo, (x25->neighbour->extended) ?
 64                                         X25_EX     66                                         X25_EXT_MIN_LEN : X25_STD_MIN_LEN);
 65                         skb_copy_from_linear_d     67                         skb_copy_from_linear_data(skbo,
 66                                                    68                                                   skb_put(skbn, skbo->len),
 67                                                    69                                                   skbo->len);
 68                         kfree_skb(skbo);           70                         kfree_skb(skbo);
 69                 }                                  71                 }
 70                                                    72 
 71                 x25->fraglen = 0;                  73                 x25->fraglen = 0;
 72         }                                          74         }
 73                                                    75 
 74         skb_set_owner_r(skbn, sk);                 76         skb_set_owner_r(skbn, sk);
 75         skb_queue_tail(&sk->sk_receive_queue,      77         skb_queue_tail(&sk->sk_receive_queue, skbn);
 76         if (!sock_flag(sk, SOCK_DEAD))             78         if (!sock_flag(sk, SOCK_DEAD))
 77                 sk->sk_data_ready(sk);         !!  79                 sk->sk_data_ready(sk, skbn->len);
 78                                                    80 
 79         return 0;                                  81         return 0;
 80 }                                                  82 }
 81                                                    83 
 82 /*                                                 84 /*
 83  * State machine for state 1, Awaiting Call Ac     85  * State machine for state 1, Awaiting Call Accepted State.
 84  * The handling of the timer(s) is in file x25     86  * The handling of the timer(s) is in file x25_timer.c.
 85  * Handling of state 0 and connection release      87  * Handling of state 0 and connection release is in af_x25.c.
 86  */                                                88  */
 87 static int x25_state1_machine(struct sock *sk,     89 static int x25_state1_machine(struct sock *sk, struct sk_buff *skb, int frametype)
 88 {                                                  90 {
 89         struct x25_address source_addr, dest_a     91         struct x25_address source_addr, dest_addr;
 90         int len;                                   92         int len;
 91         struct x25_sock *x25 = x25_sk(sk);     << 
 92                                                    93 
 93         switch (frametype) {                       94         switch (frametype) {
 94         case X25_CALL_ACCEPTED: {              !!  95                 case X25_CALL_ACCEPTED: {
                                                   >>  96                         struct x25_sock *x25 = x25_sk(sk);
                                                   >>  97 
                                                   >>  98                         x25_stop_timer(sk);
                                                   >>  99                         x25->condition = 0x00;
                                                   >> 100                         x25->vs        = 0;
                                                   >> 101                         x25->va        = 0;
                                                   >> 102                         x25->vr        = 0;
                                                   >> 103                         x25->vl        = 0;
                                                   >> 104                         x25->state     = X25_STATE_3;
                                                   >> 105                         sk->sk_state   = TCP_ESTABLISHED;
                                                   >> 106                         /*
                                                   >> 107                          *      Parse the data in the frame.
                                                   >> 108                          */
                                                   >> 109                         skb_pull(skb, X25_STD_MIN_LEN);
 95                                                   110 
 96                 x25_stop_timer(sk);            !! 111                         len = x25_parse_address_block(skb, &source_addr,
 97                 x25->condition = 0x00;         !! 112                                                 &dest_addr);
 98                 x25->vs        = 0;            !! 113                         if (len > 0)
 99                 x25->va        = 0;            !! 114                                 skb_pull(skb, len);
100                 x25->vr        = 0;            !! 115 
101                 x25->vl        = 0;            !! 116                         len = x25_parse_facilities(skb, &x25->facilities,
102                 x25->state     = X25_STATE_3;  !! 117                                                 &x25->dte_facilities,
103                 sk->sk_state   = TCP_ESTABLISH !! 118                                                 &x25->vc_facil_mask);
104                 /*                             !! 119                         if (len > 0)
105                  *      Parse the data in the  !! 120                                 skb_pull(skb, len);
106                  */                            !! 121                         else
107                 if (!pskb_may_pull(skb, X25_ST !! 122                                 return -1;
108                         goto out_clear;        !! 123                         /*
109                 skb_pull(skb, X25_STD_MIN_LEN) !! 124                          *      Copy any Call User Data.
110                                                !! 125                          */
111                 len = x25_parse_address_block( !! 126                         if (skb->len >= 0) {
112                                                !! 127                                 skb_copy_from_linear_data(skb,
113                 if (len > 0)                   !! 128                                               x25->calluserdata.cuddata,
114                         skb_pull(skb, len);    !! 129                                               skb->len);
115                 else if (len < 0)              !! 130                                 x25->calluserdata.cudlength = skb->len;
116                         goto out_clear;        !! 131                         }
117                                                !! 132                         if (!sock_flag(sk, SOCK_DEAD))
118                 len = x25_parse_facilities(skb !! 133                                 sk->sk_state_change(sk);
119                                            &x2 !! 134                         break;
120                                            &x2 << 
121                 if (len > 0)                   << 
122                         skb_pull(skb, len);    << 
123                 else if (len < 0)              << 
124                         goto out_clear;        << 
125                 /*                             << 
126                  *      Copy any Call User Dat << 
127                  */                            << 
128                 if (skb->len > 0) {            << 
129                         if (skb->len > X25_MAX << 
130                                 goto out_clear << 
131                                                << 
132                         skb_copy_bits(skb, 0,  << 
133                                 skb->len);     << 
134                         x25->calluserdata.cudl << 
135                 }                                 135                 }
136                 if (!sock_flag(sk, SOCK_DEAD)) !! 136                 case X25_CLEAR_REQUEST:
137                         sk->sk_state_change(sk !! 137                         x25_write_internal(sk, X25_CLEAR_CONFIRMATION);
138                 break;                         !! 138                         x25_disconnect(sk, ECONNREFUSED, skb->data[3], skb->data[4]);
139         }                                      !! 139                         break;
140         case X25_CALL_REQUEST:                 << 
141                 /* call collision */           << 
142                 x25->causediag.cause      = 0x << 
143                 x25->causediag.diagnostic = 0x << 
144                                                << 
145                 x25_write_internal(sk, X25_CLE << 
146                 x25_disconnect(sk, EISCONN, 0x << 
147                 break;                         << 
148                                                << 
149         case X25_CLEAR_REQUEST:                << 
150                 if (!pskb_may_pull(skb, X25_ST << 
151                         goto out_clear;        << 
152                                                << 
153                 x25_write_internal(sk, X25_CLE << 
154                 x25_disconnect(sk, ECONNREFUSE << 
155                 break;                         << 
156                                                   140 
157         default:                               !! 141                 default:
158                 break;                         !! 142                         break;
159         }                                         143         }
160                                                   144 
161         return 0;                                 145         return 0;
162                                                << 
163 out_clear:                                     << 
164         x25_write_internal(sk, X25_CLEAR_REQUE << 
165         x25->state = X25_STATE_2;              << 
166         x25_start_t23timer(sk);                << 
167         return 0;                              << 
168 }                                                 146 }
169                                                   147 
170 /*                                                148 /*
171  * State machine for state 2, Awaiting Clear C    149  * State machine for state 2, Awaiting Clear Confirmation State.
172  * The handling of the timer(s) is in file x25    150  * The handling of the timer(s) is in file x25_timer.c
173  * Handling of state 0 and connection release     151  * Handling of state 0 and connection release is in af_x25.c.
174  */                                               152  */
175 static int x25_state2_machine(struct sock *sk,    153 static int x25_state2_machine(struct sock *sk, struct sk_buff *skb, int frametype)
176 {                                                 154 {
177         switch (frametype) {                      155         switch (frametype) {
178                                                   156 
179                 case X25_CLEAR_REQUEST:           157                 case X25_CLEAR_REQUEST:
180                         if (!pskb_may_pull(skb << 
181                                 goto out_clear << 
182                                                << 
183                         x25_write_internal(sk,    158                         x25_write_internal(sk, X25_CLEAR_CONFIRMATION);
184                         x25_disconnect(sk, 0,     159                         x25_disconnect(sk, 0, skb->data[3], skb->data[4]);
185                         break;                    160                         break;
186                                                   161 
187                 case X25_CLEAR_CONFIRMATION:      162                 case X25_CLEAR_CONFIRMATION:
188                         x25_disconnect(sk, 0,     163                         x25_disconnect(sk, 0, 0, 0);
189                         break;                    164                         break;
190                                                   165 
191                 default:                          166                 default:
192                         break;                    167                         break;
193         }                                         168         }
194                                                   169 
195         return 0;                                 170         return 0;
196                                                << 
197 out_clear:                                     << 
198         x25_write_internal(sk, X25_CLEAR_REQUE << 
199         x25_start_t23timer(sk);                << 
200         return 0;                              << 
201 }                                                 171 }
202                                                   172 
203 /*                                                173 /*
204  * State machine for state 3, Connected State.    174  * State machine for state 3, Connected State.
205  * The handling of the timer(s) is in file x25    175  * The handling of the timer(s) is in file x25_timer.c
206  * Handling of state 0 and connection release     176  * Handling of state 0 and connection release is in af_x25.c.
207  */                                               177  */
208 static int x25_state3_machine(struct sock *sk,    178 static int x25_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype, int ns, int nr, int q, int d, int m)
209 {                                                 179 {
210         int queued = 0;                           180         int queued = 0;
211         int modulus;                              181         int modulus;
212         struct x25_sock *x25 = x25_sk(sk);        182         struct x25_sock *x25 = x25_sk(sk);
213                                                   183 
214         modulus = (x25->neighbour->extended) ?    184         modulus = (x25->neighbour->extended) ? X25_EMODULUS : X25_SMODULUS;
215                                                   185 
216         switch (frametype) {                      186         switch (frametype) {
217                                                   187 
218                 case X25_RESET_REQUEST:           188                 case X25_RESET_REQUEST:
219                         x25_write_internal(sk,    189                         x25_write_internal(sk, X25_RESET_CONFIRMATION);
220                         x25_stop_timer(sk);       190                         x25_stop_timer(sk);
221                         x25->condition = 0x00;    191                         x25->condition = 0x00;
222                         x25->vs        = 0;       192                         x25->vs        = 0;
223                         x25->vr        = 0;       193                         x25->vr        = 0;
224                         x25->va        = 0;       194                         x25->va        = 0;
225                         x25->vl        = 0;       195                         x25->vl        = 0;
226                         x25_requeue_frames(sk)    196                         x25_requeue_frames(sk);
227                         break;                    197                         break;
228                                                   198 
229                 case X25_CLEAR_REQUEST:           199                 case X25_CLEAR_REQUEST:
230                         if (!pskb_may_pull(skb << 
231                                 goto out_clear << 
232                                                << 
233                         x25_write_internal(sk,    200                         x25_write_internal(sk, X25_CLEAR_CONFIRMATION);
234                         x25_disconnect(sk, 0,     201                         x25_disconnect(sk, 0, skb->data[3], skb->data[4]);
235                         break;                    202                         break;
236                                                   203 
237                 case X25_RR:                      204                 case X25_RR:
238                 case X25_RNR:                     205                 case X25_RNR:
239                         if (!x25_validate_nr(s    206                         if (!x25_validate_nr(sk, nr)) {
240                                 x25_clear_queu    207                                 x25_clear_queues(sk);
241                                 x25_write_inte    208                                 x25_write_internal(sk, X25_RESET_REQUEST);
242                                 x25_start_t22t    209                                 x25_start_t22timer(sk);
243                                 x25->condition    210                                 x25->condition = 0x00;
244                                 x25->vs           211                                 x25->vs        = 0;
245                                 x25->vr           212                                 x25->vr        = 0;
246                                 x25->va           213                                 x25->va        = 0;
247                                 x25->vl           214                                 x25->vl        = 0;
248                                 x25->state        215                                 x25->state     = X25_STATE_4;
249                         } else {                  216                         } else {
250                                 x25_frames_ack    217                                 x25_frames_acked(sk, nr);
251                                 if (frametype     218                                 if (frametype == X25_RNR) {
252                                         x25->c    219                                         x25->condition |= X25_COND_PEER_RX_BUSY;
253                                 } else {          220                                 } else {
254                                         x25->c    221                                         x25->condition &= ~X25_COND_PEER_RX_BUSY;
255                                 }                 222                                 }
256                         }                         223                         }
257                         break;                    224                         break;
258                                                   225 
259                 case X25_DATA:  /* XXX */         226                 case X25_DATA:  /* XXX */
260                         x25->condition &= ~X25    227                         x25->condition &= ~X25_COND_PEER_RX_BUSY;
261                         if ((ns != x25->vr) ||    228                         if ((ns != x25->vr) || !x25_validate_nr(sk, nr)) {
262                                 x25_clear_queu    229                                 x25_clear_queues(sk);
263                                 x25_write_inte    230                                 x25_write_internal(sk, X25_RESET_REQUEST);
264                                 x25_start_t22t    231                                 x25_start_t22timer(sk);
265                                 x25->condition    232                                 x25->condition = 0x00;
266                                 x25->vs           233                                 x25->vs        = 0;
267                                 x25->vr           234                                 x25->vr        = 0;
268                                 x25->va           235                                 x25->va        = 0;
269                                 x25->vl           236                                 x25->vl        = 0;
270                                 x25->state        237                                 x25->state     = X25_STATE_4;
271                                 break;            238                                 break;
272                         }                         239                         }
273                         x25_frames_acked(sk, n    240                         x25_frames_acked(sk, nr);
274                         if (ns == x25->vr) {      241                         if (ns == x25->vr) {
275                                 if (x25_queue_    242                                 if (x25_queue_rx_frame(sk, skb, m) == 0) {
276                                         x25->v    243                                         x25->vr = (x25->vr + 1) % modulus;
277                                         queued    244                                         queued = 1;
278                                 } else {          245                                 } else {
279                                         /* Sho    246                                         /* Should never happen */
280                                         x25_cl    247                                         x25_clear_queues(sk);
281                                         x25_wr    248                                         x25_write_internal(sk, X25_RESET_REQUEST);
282                                         x25_st    249                                         x25_start_t22timer(sk);
283                                         x25->c    250                                         x25->condition = 0x00;
284                                         x25->v    251                                         x25->vs        = 0;
285                                         x25->v    252                                         x25->vr        = 0;
286                                         x25->v    253                                         x25->va        = 0;
287                                         x25->v    254                                         x25->vl        = 0;
288                                         x25->s    255                                         x25->state     = X25_STATE_4;
289                                         break;    256                                         break;
290                                 }                 257                                 }
291                                 if (atomic_rea    258                                 if (atomic_read(&sk->sk_rmem_alloc) >
292                                     (sk->sk_rc    259                                     (sk->sk_rcvbuf >> 1))
293                                         x25->c    260                                         x25->condition |= X25_COND_OWN_RX_BUSY;
294                         }                         261                         }
295                         /*                        262                         /*
296                          *      If the window     263                          *      If the window is full Ack it immediately, else
297                          *      start the hold    264                          *      start the holdback timer.
298                          */                       265                          */
299                         if (((x25->vl + x25->f    266                         if (((x25->vl + x25->facilities.winsize_in) % modulus) == x25->vr) {
300                                 x25->condition    267                                 x25->condition &= ~X25_COND_ACK_PENDING;
301                                 x25_stop_timer    268                                 x25_stop_timer(sk);
302                                 x25_enquiry_re    269                                 x25_enquiry_response(sk);
303                         } else {                  270                         } else {
304                                 x25->condition    271                                 x25->condition |= X25_COND_ACK_PENDING;
305                                 x25_start_t2ti    272                                 x25_start_t2timer(sk);
306                         }                         273                         }
307                         break;                    274                         break;
308                                                   275 
309                 case X25_INTERRUPT_CONFIRMATIO    276                 case X25_INTERRUPT_CONFIRMATION:
310                         clear_bit(X25_INTERRUP !! 277                         x25->intflag = 0;
311                         break;                    278                         break;
312                                                   279 
313                 case X25_INTERRUPT:               280                 case X25_INTERRUPT:
314                         if (sock_flag(sk, SOCK    281                         if (sock_flag(sk, SOCK_URGINLINE))
315                                 queued = !sock    282                                 queued = !sock_queue_rcv_skb(sk, skb);
316                         else {                    283                         else {
317                                 skb_set_owner_    284                                 skb_set_owner_r(skb, sk);
318                                 skb_queue_tail    285                                 skb_queue_tail(&x25->interrupt_in_queue, skb);
319                                 queued = 1;       286                                 queued = 1;
320                         }                         287                         }
321                         sk_send_sigurg(sk);       288                         sk_send_sigurg(sk);
322                         x25_write_internal(sk,    289                         x25_write_internal(sk, X25_INTERRUPT_CONFIRMATION);
323                         break;                    290                         break;
324                                                   291 
325                 default:                          292                 default:
326                         pr_warn("unknown %02X  !! 293                         printk(KERN_WARNING "x25: unknown %02X in state 3\n", frametype);
327                         break;                    294                         break;
328         }                                         295         }
329                                                   296 
330         return queued;                            297         return queued;
331                                                << 
332 out_clear:                                     << 
333         x25_write_internal(sk, X25_CLEAR_REQUE << 
334         x25->state = X25_STATE_2;              << 
335         x25_start_t23timer(sk);                << 
336         return 0;                              << 
337 }                                                 298 }
338                                                   299 
339 /*                                                300 /*
340  * State machine for state 4, Awaiting Reset C    301  * State machine for state 4, Awaiting Reset Confirmation State.
341  * The handling of the timer(s) is in file x25    302  * The handling of the timer(s) is in file x25_timer.c
342  * Handling of state 0 and connection release     303  * Handling of state 0 and connection release is in af_x25.c.
343  */                                               304  */
344 static int x25_state4_machine(struct sock *sk,    305 static int x25_state4_machine(struct sock *sk, struct sk_buff *skb, int frametype)
345 {                                                 306 {
346         struct x25_sock *x25 = x25_sk(sk);     << 
347                                                << 
348         switch (frametype) {                      307         switch (frametype) {
349                                                   308 
350                 case X25_RESET_REQUEST:           309                 case X25_RESET_REQUEST:
351                         x25_write_internal(sk,    310                         x25_write_internal(sk, X25_RESET_CONFIRMATION);
352                         fallthrough;           << 
353                 case X25_RESET_CONFIRMATION: {    311                 case X25_RESET_CONFIRMATION: {
                                                   >> 312                         struct x25_sock *x25 = x25_sk(sk);
                                                   >> 313 
354                         x25_stop_timer(sk);       314                         x25_stop_timer(sk);
355                         x25->condition = 0x00;    315                         x25->condition = 0x00;
356                         x25->va        = 0;       316                         x25->va        = 0;
357                         x25->vr        = 0;       317                         x25->vr        = 0;
358                         x25->vs        = 0;       318                         x25->vs        = 0;
359                         x25->vl        = 0;       319                         x25->vl        = 0;
360                         x25->state     = X25_S    320                         x25->state     = X25_STATE_3;
361                         x25_requeue_frames(sk)    321                         x25_requeue_frames(sk);
362                         break;                    322                         break;
363                 }                                 323                 }
364                 case X25_CLEAR_REQUEST:           324                 case X25_CLEAR_REQUEST:
365                         if (!pskb_may_pull(skb << 
366                                 goto out_clear << 
367                                                << 
368                         x25_write_internal(sk, << 
369                         x25_disconnect(sk, 0,  << 
370                         break;                 << 
371                                                << 
372                 default:                       << 
373                         break;                 << 
374         }                                      << 
375                                                << 
376         return 0;                              << 
377                                                << 
378 out_clear:                                     << 
379         x25_write_internal(sk, X25_CLEAR_REQUE << 
380         x25->state = X25_STATE_2;              << 
381         x25_start_t23timer(sk);                << 
382         return 0;                              << 
383 }                                              << 
384                                                << 
385 /*                                             << 
386  * State machine for state 5, Call Accepted /  << 
387  * The handling of the timer(s) is in file x25 << 
388  * Handling of state 0 and connection release  << 
389  */                                            << 
390 static int x25_state5_machine(struct sock *sk, << 
391 {                                              << 
392         struct x25_sock *x25 = x25_sk(sk);     << 
393                                                << 
394         switch (frametype) {                   << 
395                 case X25_CLEAR_REQUEST:        << 
396                         if (!pskb_may_pull(skb << 
397                                 x25_write_inte << 
398                                 x25->state = X << 
399                                 x25_start_t23t << 
400                                 return 0;      << 
401                         }                      << 
402                                                << 
403                         x25_write_internal(sk,    325                         x25_write_internal(sk, X25_CLEAR_CONFIRMATION);
404                         x25_disconnect(sk, 0,     326                         x25_disconnect(sk, 0, skb->data[3], skb->data[4]);
405                         break;                    327                         break;
406                                                   328 
407                 default:                          329                 default:
408                         break;                    330                         break;
409         }                                         331         }
410                                                   332 
411         return 0;                                 333         return 0;
412 }                                                 334 }
413                                                   335 
414 /* Higher level upcall for a LAPB frame */        336 /* Higher level upcall for a LAPB frame */
415 int x25_process_rx_frame(struct sock *sk, stru    337 int x25_process_rx_frame(struct sock *sk, struct sk_buff *skb)
416 {                                                 338 {
417         struct x25_sock *x25 = x25_sk(sk);        339         struct x25_sock *x25 = x25_sk(sk);
418         int queued = 0, frametype, ns, nr, q,     340         int queued = 0, frametype, ns, nr, q, d, m;
419                                                   341 
420         if (x25->state == X25_STATE_0)            342         if (x25->state == X25_STATE_0)
421                 return 0;                         343                 return 0;
422                                                   344 
423         frametype = x25_decode(sk, skb, &ns, &    345         frametype = x25_decode(sk, skb, &ns, &nr, &q, &d, &m);
424                                                   346 
425         switch (x25->state) {                     347         switch (x25->state) {
426         case X25_STATE_1:                      !! 348                 case X25_STATE_1:
427                 queued = x25_state1_machine(sk !! 349                         queued = x25_state1_machine(sk, skb, frametype);
428                 break;                         !! 350                         break;
429         case X25_STATE_2:                      !! 351                 case X25_STATE_2:
430                 queued = x25_state2_machine(sk !! 352                         queued = x25_state2_machine(sk, skb, frametype);
431                 break;                         !! 353                         break;
432         case X25_STATE_3:                      !! 354                 case X25_STATE_3:
433                 queued = x25_state3_machine(sk !! 355                         queued = x25_state3_machine(sk, skb, frametype, ns, nr, q, d, m);
434                 break;                         !! 356                         break;
435         case X25_STATE_4:                      !! 357                 case X25_STATE_4:
436                 queued = x25_state4_machine(sk !! 358                         queued = x25_state4_machine(sk, skb, frametype);
437                 break;                         !! 359                         break;
438         case X25_STATE_5:                      << 
439                 queued = x25_state5_machine(sk << 
440                 break;                         << 
441         }                                         360         }
442                                                   361 
443         x25_kick(sk);                             362         x25_kick(sk);
444                                                   363 
445         return queued;                            364         return queued;
446 }                                                 365 }
447                                                   366 
448 int x25_backlog_rcv(struct sock *sk, struct sk    367 int x25_backlog_rcv(struct sock *sk, struct sk_buff *skb)
449 {                                                 368 {
450         int queued = x25_process_rx_frame(sk,     369         int queued = x25_process_rx_frame(sk, skb);
451                                                   370 
452         if (!queued)                              371         if (!queued)
453                 kfree_skb(skb);                   372                 kfree_skb(skb);
454                                                   373 
455         return 0;                                 374         return 0;
456 }                                                 375 }
457                                                   376 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php