diff options
author | Shaun Pereira <spereira@tusc.com.au> | 2005-06-23 01:16:17 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-06-23 01:16:17 -0400 |
commit | ebc3f64b864fc16a594c2e63bf55a55c7d42084b (patch) | |
tree | 95040f32ad5902051527b91966118e565d48865b /net/x25/x25_facilities.c | |
parent | cb65d506c34c86df5bcef939ce5a8666a451bd8b (diff) |
[X25]: Fast select with no restriction on response
This patch is a follow up to patch 1 regarding "Selective Sub Address
matching with call user data". It allows use of the Fast-Select-Acceptance
optional user facility for X.25.
This patch just implements fast select with no restriction on response
(NRR). What this means (according to ITU-T Recomendation 10/96 section
6.16) is that if in an incoming call packet, the relevant facility bits are
set for fast-select-NRR, then the called DTE can issue a direct response to
the incoming packet using a call-accepted packet that contains
call-user-data. This patch allows such a response.
The called DTE can also respond with a clear-request packet that contains
call-user-data. However, this feature is currently not implemented by the
patch.
How is Fast Select Acceptance used?
By default, the system does not allow fast select acceptance (as before).
To enable a response to fast select acceptance,
After a listen socket in created and bound as follows
socket(AF_X25, SOCK_SEQPACKET, 0);
bind(call_soc, (struct sockaddr *)&locl_addr, sizeof(locl_addr));
but before a listen system call is made, the following ioctl should be used.
ioctl(call_soc,SIOCX25CALLACCPTAPPRV);
Now the listen system call can be made
listen(call_soc, 4);
After this, an incoming-call packet will be accepted, but no call-accepted
packet will be sent back until the following system call is made on the socket
that accepts the call
ioctl(vc_soc,SIOCX25SENDCALLACCPT);
The network (or cisco xot router used for testing here) will allow the
application server's call-user-data in the call-accepted packet,
provided the call-request was made with Fast-select NRR.
Signed-off-by: Shaun Pereira <spereira@tusc.com.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/x25/x25_facilities.c')
-rw-r--r-- | net/x25/x25_facilities.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/net/x25/x25_facilities.c b/net/x25/x25_facilities.c index a21bdb95f9a8..54278b962f4c 100644 --- a/net/x25/x25_facilities.c +++ b/net/x25/x25_facilities.c | |||
@@ -17,6 +17,8 @@ | |||
17 | * X.25 001 Split from x25_subr.c | 17 | * X.25 001 Split from x25_subr.c |
18 | * mar/20/00 Daniela Squassoni Disabling/enabling of facilities | 18 | * mar/20/00 Daniela Squassoni Disabling/enabling of facilities |
19 | * negotiation. | 19 | * negotiation. |
20 | * apr/14/05 Shaun Pereira - Allow fast select with no restriction | ||
21 | * on response. | ||
20 | */ | 22 | */ |
21 | 23 | ||
22 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
@@ -43,9 +45,31 @@ int x25_parse_facilities(struct sk_buff *skb, | |||
43 | case X25_FAC_CLASS_A: | 45 | case X25_FAC_CLASS_A: |
44 | switch (*p) { | 46 | switch (*p) { |
45 | case X25_FAC_REVERSE: | 47 | case X25_FAC_REVERSE: |
46 | facilities->reverse = p[1] & 0x01; | 48 | if((p[1] & 0x81) == 0x81) { |
47 | *vc_fac_mask |= X25_MASK_REVERSE; | 49 | facilities->reverse = p[1] & 0x81; |
48 | break; | 50 | *vc_fac_mask |= X25_MASK_REVERSE; |
51 | break; | ||
52 | } | ||
53 | |||
54 | if((p[1] & 0x01) == 0x01) { | ||
55 | facilities->reverse = p[1] & 0x01; | ||
56 | *vc_fac_mask |= X25_MASK_REVERSE; | ||
57 | break; | ||
58 | } | ||
59 | |||
60 | if((p[1] & 0x80) == 0x80) { | ||
61 | facilities->reverse = p[1] & 0x80; | ||
62 | *vc_fac_mask |= X25_MASK_REVERSE; | ||
63 | break; | ||
64 | } | ||
65 | |||
66 | if(p[1] == 0x00) { | ||
67 | facilities->reverse | ||
68 | = X25_DEFAULT_REVERSE; | ||
69 | *vc_fac_mask |= X25_MASK_REVERSE; | ||
70 | break; | ||
71 | } | ||
72 | |||
49 | case X25_FAC_THROUGHPUT: | 73 | case X25_FAC_THROUGHPUT: |
50 | facilities->throughput = p[1]; | 74 | facilities->throughput = p[1]; |
51 | *vc_fac_mask |= X25_MASK_THROUGHPUT; | 75 | *vc_fac_mask |= X25_MASK_THROUGHPUT; |
@@ -122,7 +146,7 @@ int x25_create_facilities(unsigned char *buffer, | |||
122 | 146 | ||
123 | if (facilities->reverse && (facil_mask & X25_MASK_REVERSE)) { | 147 | if (facilities->reverse && (facil_mask & X25_MASK_REVERSE)) { |
124 | *p++ = X25_FAC_REVERSE; | 148 | *p++ = X25_FAC_REVERSE; |
125 | *p++ = !!facilities->reverse; | 149 | *p++ = facilities->reverse; |
126 | } | 150 | } |
127 | 151 | ||
128 | if (facilities->throughput && (facil_mask & X25_MASK_THROUGHPUT)) { | 152 | if (facilities->throughput && (facil_mask & X25_MASK_THROUGHPUT)) { |
@@ -171,7 +195,7 @@ int x25_negotiate_facilities(struct sk_buff *skb, struct sock *sk, | |||
171 | /* | 195 | /* |
172 | * They want reverse charging, we won't accept it. | 196 | * They want reverse charging, we won't accept it. |
173 | */ | 197 | */ |
174 | if (theirs.reverse && ours->reverse) { | 198 | if ((theirs.reverse & 0x01 ) && (ours->reverse & 0x01)) { |
175 | SOCK_DEBUG(sk, "X.25: rejecting reverse charging request"); | 199 | SOCK_DEBUG(sk, "X.25: rejecting reverse charging request"); |
176 | return -1; | 200 | return -1; |
177 | } | 201 | } |