diff options
Diffstat (limited to 'net/x25/af_x25.c')
-rw-r--r-- | net/x25/af_x25.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index e17d84a55d5e..04bec047fa9a 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c | |||
@@ -31,6 +31,8 @@ | |||
31 | * x25_proc.c, using seq_file | 31 | * x25_proc.c, using seq_file |
32 | * 2005-04-02 Shaun Pereira Selective sub address matching | 32 | * 2005-04-02 Shaun Pereira Selective sub address matching |
33 | * with call user data | 33 | * with call user data |
34 | * 2005-04-15 Shaun Pereira Fast select with no restriction on | ||
35 | * response | ||
34 | */ | 36 | */ |
35 | 37 | ||
36 | #include <linux/config.h> | 38 | #include <linux/config.h> |
@@ -502,6 +504,8 @@ static int x25_create(struct socket *sock, int protocol) | |||
502 | x25->t2 = sysctl_x25_ack_holdback_timeout; | 504 | x25->t2 = sysctl_x25_ack_holdback_timeout; |
503 | x25->state = X25_STATE_0; | 505 | x25->state = X25_STATE_0; |
504 | x25->cudmatchlength = 0; | 506 | x25->cudmatchlength = 0; |
507 | x25->accptapprv = X25_DENY_ACCPT_APPRV; /* normally no cud */ | ||
508 | /* on call accept */ | ||
505 | 509 | ||
506 | x25->facilities.winsize_in = X25_DEFAULT_WINDOW_SIZE; | 510 | x25->facilities.winsize_in = X25_DEFAULT_WINDOW_SIZE; |
507 | x25->facilities.winsize_out = X25_DEFAULT_WINDOW_SIZE; | 511 | x25->facilities.winsize_out = X25_DEFAULT_WINDOW_SIZE; |
@@ -551,6 +555,7 @@ static struct sock *x25_make_new(struct sock *osk) | |||
551 | x25->facilities = ox25->facilities; | 555 | x25->facilities = ox25->facilities; |
552 | x25->qbitincl = ox25->qbitincl; | 556 | x25->qbitincl = ox25->qbitincl; |
553 | x25->cudmatchlength = ox25->cudmatchlength; | 557 | x25->cudmatchlength = ox25->cudmatchlength; |
558 | x25->accptapprv = ox25->accptapprv; | ||
554 | 559 | ||
555 | x25_init_timers(sk); | 560 | x25_init_timers(sk); |
556 | out: | 561 | out: |
@@ -900,9 +905,11 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb, | |||
900 | makex25->vc_facil_mask &= ~X25_MASK_REVERSE; | 905 | makex25->vc_facil_mask &= ~X25_MASK_REVERSE; |
901 | makex25->cudmatchlength = x25_sk(sk)->cudmatchlength; | 906 | makex25->cudmatchlength = x25_sk(sk)->cudmatchlength; |
902 | 907 | ||
903 | x25_write_internal(make, X25_CALL_ACCEPTED); | 908 | /* Normally all calls are accepted immediatly */ |
904 | 909 | if(makex25->accptapprv & X25_DENY_ACCPT_APPRV) { | |
905 | makex25->state = X25_STATE_3; | 910 | x25_write_internal(make, X25_CALL_ACCEPTED); |
911 | makex25->state = X25_STATE_3; | ||
912 | } | ||
906 | 913 | ||
907 | /* | 914 | /* |
908 | * Incoming Call User Data. | 915 | * Incoming Call User Data. |
@@ -1294,7 +1301,8 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
1294 | if (facilities.throughput < 0x03 || | 1301 | if (facilities.throughput < 0x03 || |
1295 | facilities.throughput > 0xDD) | 1302 | facilities.throughput > 0xDD) |
1296 | break; | 1303 | break; |
1297 | if (facilities.reverse && facilities.reverse != 1) | 1304 | if (facilities.reverse && |
1305 | (facilities.reverse | 0x81)!= 0x81) | ||
1298 | break; | 1306 | break; |
1299 | x25->facilities = facilities; | 1307 | x25->facilities = facilities; |
1300 | rc = 0; | 1308 | rc = 0; |
@@ -1348,6 +1356,27 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
1348 | break; | 1356 | break; |
1349 | } | 1357 | } |
1350 | 1358 | ||
1359 | case SIOCX25CALLACCPTAPPRV: { | ||
1360 | rc = -EINVAL; | ||
1361 | if (sk->sk_state != TCP_CLOSE) | ||
1362 | break; | ||
1363 | x25->accptapprv = X25_ALLOW_ACCPT_APPRV; | ||
1364 | rc = 0; | ||
1365 | break; | ||
1366 | } | ||
1367 | |||
1368 | case SIOCX25SENDCALLACCPT: { | ||
1369 | rc = -EINVAL; | ||
1370 | if (sk->sk_state != TCP_ESTABLISHED) | ||
1371 | break; | ||
1372 | if (x25->accptapprv) /* must call accptapprv above */ | ||
1373 | break; | ||
1374 | x25_write_internal(sk, X25_CALL_ACCEPTED); | ||
1375 | x25->state = X25_STATE_3; | ||
1376 | rc = 0; | ||
1377 | break; | ||
1378 | } | ||
1379 | |||
1351 | default: | 1380 | default: |
1352 | rc = dev_ioctl(cmd, argp); | 1381 | rc = dev_ioctl(cmd, argp); |
1353 | break; | 1382 | break; |