Lines Matching +full:reverse +full:- +full:data
1 // SPDX-License-Identifier: GPL-2.0-or-later
15 * apr/14/05 Shaun Pereira - Allow fast select with no restriction
28 * x25_parse_facilities - Parse facilities from skb into the facilities structs
36 * -1 - Parsing error, caller should drop call and clean up
37 * 0 - Parse OK, this skb has no facilities
38 * >0 - Parse OK, returns the length of the facilities header
55 dte_facs->calling_len = 0; in x25_parse_facilities()
56 dte_facs->called_len = 0; in x25_parse_facilities()
57 memset(dte_facs->called_ae, '\0', sizeof(dte_facs->called_ae)); in x25_parse_facilities()
58 memset(dte_facs->calling_ae, '\0', sizeof(dte_facs->calling_ae)); in x25_parse_facilities()
63 len = skb->data[0]; in x25_parse_facilities()
66 return -1; in x25_parse_facilities()
68 p = skb->data + 1; in x25_parse_facilities()
74 return -1; in x25_parse_facilities()
78 facilities->reverse = p[1] & 0x81; in x25_parse_facilities()
84 facilities->reverse = p[1] & 0x01; in x25_parse_facilities()
90 facilities->reverse = p[1] & 0x80; in x25_parse_facilities()
96 facilities->reverse in x25_parse_facilities()
103 facilities->throughput = p[1]; in x25_parse_facilities()
115 len -= 2; in x25_parse_facilities()
119 return -1; in x25_parse_facilities()
122 facilities->pacsize_in = p[1]; in x25_parse_facilities()
123 facilities->pacsize_out = p[2]; in x25_parse_facilities()
127 facilities->winsize_in = p[1]; in x25_parse_facilities()
128 facilities->winsize_out = p[2]; in x25_parse_facilities()
138 len -= 3; in x25_parse_facilities()
142 return -1; in x25_parse_facilities()
147 len -= 4; in x25_parse_facilities()
151 return -1; in x25_parse_facilities()
155 return -1; in x25_parse_facilities()
157 return -1; in x25_parse_facilities()
158 dte_facs->calling_len = p[2]; in x25_parse_facilities()
159 memcpy(dte_facs->calling_ae, &p[3], p[1] - 1); in x25_parse_facilities()
164 return -1; in x25_parse_facilities()
166 return -1; in x25_parse_facilities()
167 dte_facs->called_len = p[2]; in x25_parse_facilities()
168 memcpy(dte_facs->called_ae, &p[3], p[1] - 1); in x25_parse_facilities()
176 len -= p[1] + 2; in x25_parse_facilities()
182 return p - skb->data; in x25_parse_facilities()
205 if (facilities->reverse && (facil_mask & X25_MASK_REVERSE)) { in x25_create_facilities()
207 *p++ = facilities->reverse; in x25_create_facilities()
210 if (facilities->throughput && (facil_mask & X25_MASK_THROUGHPUT)) { in x25_create_facilities()
212 *p++ = facilities->throughput; in x25_create_facilities()
215 if ((facilities->pacsize_in || facilities->pacsize_out) && in x25_create_facilities()
218 *p++ = facilities->pacsize_in ? : facilities->pacsize_out; in x25_create_facilities()
219 *p++ = facilities->pacsize_out ? : facilities->pacsize_in; in x25_create_facilities()
222 if ((facilities->winsize_in || facilities->winsize_out) && in x25_create_facilities()
225 *p++ = facilities->winsize_in ? : facilities->winsize_out; in x25_create_facilities()
226 *p++ = facilities->winsize_out ? : facilities->winsize_in; in x25_create_facilities()
234 if (dte_facs->calling_len && (facil_mask & X25_MASK_CALLING_AE)) { in x25_create_facilities()
235 unsigned int bytecount = (dte_facs->calling_len + 1) >> 1; in x25_create_facilities()
238 *p++ = dte_facs->calling_len; in x25_create_facilities()
239 memcpy(p, dte_facs->calling_ae, bytecount); in x25_create_facilities()
243 if (dte_facs->called_len && (facil_mask & X25_MASK_CALLED_AE)) { in x25_create_facilities()
244 unsigned int bytecount = (dte_facs->called_len % 2) ? in x25_create_facilities()
245 dte_facs->called_len / 2 + 1 : in x25_create_facilities()
246 dte_facs->called_len / 2; in x25_create_facilities()
249 *p++ = dte_facs->called_len; in x25_create_facilities()
250 memcpy(p, dte_facs->called_ae, bytecount); in x25_create_facilities()
254 len = p - buffer; in x25_create_facilities()
255 buffer[0] = len - 1; in x25_create_facilities()
263 * The only real problem is with reverse charging.
269 struct x25_facilities *ours = &x25->facilities; in x25_negotiate_facilities()
277 len = x25_parse_facilities(skb, &theirs, dte, &x25->vc_facil_mask); in x25_negotiate_facilities()
282 * They want reverse charging, we won't accept it. in x25_negotiate_facilities()
284 if ((theirs.reverse & 0x01 ) && (ours->reverse & 0x01)) { in x25_negotiate_facilities()
285 SOCK_DEBUG(sk, "X.25: rejecting reverse charging request\n"); in x25_negotiate_facilities()
286 return -1; in x25_negotiate_facilities()
289 new->reverse = theirs.reverse; in x25_negotiate_facilities()
294 int ours_in = ours->throughput & 0x0f; in x25_negotiate_facilities()
295 int ours_out = ours->throughput & 0xf0; in x25_negotiate_facilities()
298 new->throughput = (new->throughput & 0xf0) | theirs_in; in x25_negotiate_facilities()
303 new->throughput = (new->throughput & 0x0f) | theirs_out; in x25_negotiate_facilities()
308 if (theirs.pacsize_in < ours->pacsize_in) { in x25_negotiate_facilities()
310 new->pacsize_in = theirs.pacsize_in; in x25_negotiate_facilities()
312 if (theirs.pacsize_out < ours->pacsize_out) { in x25_negotiate_facilities()
314 new->pacsize_out = theirs.pacsize_out; in x25_negotiate_facilities()
319 if (theirs.winsize_in < ours->winsize_in) { in x25_negotiate_facilities()
321 new->winsize_in = theirs.winsize_in; in x25_negotiate_facilities()
323 if (theirs.winsize_out < ours->winsize_out) { in x25_negotiate_facilities()
325 new->winsize_out = theirs.winsize_out; in x25_negotiate_facilities()
340 if (!nb->extended) { in x25_limit_facilities()
341 if (facilities->winsize_in > 7) { in x25_limit_facilities()
343 facilities->winsize_in = 7; in x25_limit_facilities()
345 if (facilities->winsize_out > 7) { in x25_limit_facilities()
346 facilities->winsize_out = 7; in x25_limit_facilities()