Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 2838
b: refs/heads/master
c: cb65d50
h: refs/heads/master
v: v3
  • Loading branch information
Shaun Pereira authored and David S. Miller committed Jun 23, 2005
1 parent d9173c0 commit 73ec34c
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 46 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 68d318720052154bc6b2513b0f15d0d947cc53c9
refs/heads/master: cb65d506c34c86df5bcef939ce5a8666a451bd8b
10 changes: 10 additions & 0 deletions trunk/include/linux/x25.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
* History
* mar/20/00 Daniela Squassoni Disabling/enabling of facilities
* negotiation.
* apr/02/05 Shaun Pereira Selective sub address matching with
* call user data
*/

#ifndef X25_KERNEL_H
Expand All @@ -16,6 +18,7 @@
#define SIOCX25GCALLUSERDATA (SIOCPROTOPRIVATE + 4)
#define SIOCX25SCALLUSERDATA (SIOCPROTOPRIVATE + 5)
#define SIOCX25GCAUSEDIAG (SIOCPROTOPRIVATE + 6)
#define SIOCX25SCUDMATCHLEN (SIOCPROTOPRIVATE + 7)

/*
* Values for {get,set}sockopt.
Expand Down Expand Up @@ -109,4 +112,11 @@ struct x25_causediag {
unsigned char diagnostic;
};

/*
* Further optional call user data match length selection
*/
struct x25_subaddr {
unsigned int cudmatchlength;
};

#endif
3 changes: 1 addition & 2 deletions trunk/include/net/x25.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ struct x25_sock {
struct sock sk;
struct x25_address source_addr, dest_addr;
struct x25_neigh *neighbour;
unsigned int lci;
unsigned int lci, cudmatchlength;
unsigned char state, condition, qbitincl, intflag;
unsigned short vs, vr, va, vl;
unsigned long t2, t21, t22, t23;
Expand Down Expand Up @@ -242,7 +242,6 @@ extern int x25_validate_nr(struct sock *, unsigned short);
extern void x25_write_internal(struct sock *, int);
extern int x25_decode(struct sock *, struct sk_buff *, int *, int *, int *, int *, int *);
extern void x25_disconnect(struct sock *, int, unsigned char, unsigned char);
extern int x25_check_calluserdata(struct x25_calluserdata *,struct x25_calluserdata *);

/* x25_timer.c */
extern void x25_start_heartbeat(struct sock *);
Expand Down
73 changes: 48 additions & 25 deletions trunk/net/x25/af_x25.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
* 2000-11-14 Henner Eisen Closing datalink from NETDEV_GOING_DOWN
* 2002-10-06 Arnaldo C. Melo Get rid of cli/sti, move proc stuff to
* x25_proc.c, using seq_file
* 2005-04-02 Shaun Pereira Selective sub address matching
* with call user data
*/

#include <linux/config.h>
Expand Down Expand Up @@ -219,7 +221,8 @@ static void x25_insert_socket(struct sock *sk)
* Note: if a listening socket has cud set it must only get calls
* with matching cud.
*/
static struct sock *x25_find_listener(struct x25_address *addr, struct x25_calluserdata *calluserdata)
static struct sock *x25_find_listener(struct x25_address *addr,
struct sk_buff *skb)
{
struct sock *s;
struct sock *next_best;
Expand All @@ -230,22 +233,23 @@ static struct sock *x25_find_listener(struct x25_address *addr, struct x25_callu

sk_for_each(s, node, &x25_list)
if ((!strcmp(addr->x25_addr,
x25_sk(s)->source_addr.x25_addr) ||
!strcmp(addr->x25_addr,
null_x25_address.x25_addr)) &&
s->sk_state == TCP_LISTEN) {

x25_sk(s)->source_addr.x25_addr) ||
!strcmp(addr->x25_addr,
null_x25_address.x25_addr)) &&
s->sk_state == TCP_LISTEN) {
/*
* Found a listening socket, now check the incoming
* call user data vs this sockets call user data
*/
if (x25_check_calluserdata(&x25_sk(s)->calluserdata, calluserdata)) {
sock_hold(s);
goto found;
}
if (x25_sk(s)->calluserdata.cudlength == 0) {
if(skb->len > 0 && x25_sk(s)->cudmatchlength > 0) {
if((memcmp(x25_sk(s)->calluserdata.cuddata,
skb->data,
x25_sk(s)->cudmatchlength)) == 0) {
sock_hold(s);
goto found;
}
} else
next_best = s;
}
}
if (next_best) {
s = next_best;
Expand Down Expand Up @@ -497,6 +501,7 @@ static int x25_create(struct socket *sock, int protocol)
x25->t23 = sysctl_x25_clear_request_timeout;
x25->t2 = sysctl_x25_ack_holdback_timeout;
x25->state = X25_STATE_0;
x25->cudmatchlength = 0;

x25->facilities.winsize_in = X25_DEFAULT_WINDOW_SIZE;
x25->facilities.winsize_out = X25_DEFAULT_WINDOW_SIZE;
Expand Down Expand Up @@ -545,6 +550,7 @@ static struct sock *x25_make_new(struct sock *osk)
x25->t2 = ox25->t2;
x25->facilities = ox25->facilities;
x25->qbitincl = ox25->qbitincl;
x25->cudmatchlength = ox25->cudmatchlength;

x25_init_timers(sk);
out:
Expand Down Expand Up @@ -822,7 +828,6 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
struct x25_sock *makex25;
struct x25_address source_addr, dest_addr;
struct x25_facilities facilities;
struct x25_calluserdata calluserdata;
int len, rc;

/*
Expand All @@ -844,20 +849,11 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
len = skb->data[0] + 1;
skb_pull(skb,len);

/*
* Incoming Call User Data.
*/
if (skb->len >= 0) {
memcpy(calluserdata.cuddata, skb->data, skb->len);
calluserdata.cudlength = skb->len;
}

skb_push(skb,len);

/*
* Find a listener for the particular address/cud pair.
*/
sk = x25_find_listener(&source_addr,&calluserdata);
sk = x25_find_listener(&source_addr,skb);
skb_push(skb,len);

/*
* We can't accept the Call Request.
Expand Down Expand Up @@ -900,12 +896,22 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
makex25->neighbour = nb;
makex25->facilities = facilities;
makex25->vc_facil_mask = x25_sk(sk)->vc_facil_mask;
makex25->calluserdata = calluserdata;
/* ensure no reverse facil on accept */
makex25->vc_facil_mask &= ~X25_MASK_REVERSE;
makex25->cudmatchlength = x25_sk(sk)->cudmatchlength;

x25_write_internal(make, X25_CALL_ACCEPTED);

makex25->state = X25_STATE_3;

/*
* Incoming Call User Data.
*/
if (skb->len >= 0) {
memcpy(makex25->calluserdata.cuddata, skb->data, skb->len);
makex25->calluserdata.cudlength = skb->len;
}

sk->sk_ack_backlog++;

x25_insert_socket(make);
Expand Down Expand Up @@ -1325,6 +1331,23 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
break;
}

case SIOCX25SCUDMATCHLEN: {
struct x25_subaddr sub_addr;
rc = -EINVAL;
if(sk->sk_state != TCP_CLOSE)
break;
rc = -EFAULT;
if (copy_from_user(&sub_addr, argp,
sizeof(sub_addr)))
break;
rc = -EINVAL;
if(sub_addr.cudmatchlength > X25_MAX_CUD_LEN)
break;
x25->cudmatchlength = sub_addr.cudmatchlength;
rc = 0;
break;
}

default:
rc = dev_ioctl(cmd, argp);
break;
Expand Down
18 changes: 0 additions & 18 deletions trunk/net/x25/x25_subr.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,21 +354,3 @@ void x25_check_rbuf(struct sock *sk)
}
}

/*
* Compare 2 calluserdata structures, used to find correct listening sockets
* when call user data is used.
*/
int x25_check_calluserdata(struct x25_calluserdata *ours, struct x25_calluserdata *theirs)
{
int i;
if (ours->cudlength != theirs->cudlength)
return 0;

for (i=0;i<ours->cudlength;i++) {
if (ours->cuddata[i] != theirs->cuddata[i]) {
return 0;
}
}
return 1;
}

0 comments on commit 73ec34c

Please sign in to comment.