summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@hera.kernel.org>2002-09-29 00:39:46 -0700
committerArnaldo Carvalho de Melo <acme@hera.kernel.org>2002-09-29 00:39:46 -0700
commit5c0fbae16feb334cc28a74dffbd09c2c6063290b (patch)
tree5e597781b2ed2ddceaaae572576e8879ca34c010 /include
parent536ce36260adc007ce0a5b27786cbb8f5bcc72f4 (diff)
parent004ffedc473a504ab1bad9cfe41ba3359a2f8297 (diff)
Merge hera.kernel.org:/home/acme/BK/x25-2.5.old
into hera.kernel.org:/home/acme/BK/x25-2.5
Diffstat (limited to 'include')
-rw-r--r--include/linux/x25.h16
-rw-r--r--include/net/lapb.h60
-rw-r--r--include/net/x25.h61
3 files changed, 87 insertions, 50 deletions
diff --git a/include/linux/x25.h b/include/linux/x25.h
index 49bb2a4b39ec..7531cfed5885 100644
--- a/include/linux/x25.h
+++ b/include/linux/x25.h
@@ -39,16 +39,16 @@
* An X.121 address, it is held as ASCII text, null terminated, up to 15
* digits and a null terminator.
*/
-typedef struct {
- char x25_addr[16];
-} x25_address;
+struct x25_address {
+ char x25_addr[16];
+};
/*
* Linux X.25 Address structure, used for bind, and connect mostly.
*/
struct sockaddr_x25 {
- sa_family_t sx25_family; /* Must be AF_X25 */
- x25_address sx25_addr; /* X.121 Address */
+ sa_family_t sx25_family; /* Must be AF_X25 */
+ struct x25_address sx25_addr; /* X.121 Address */
};
/*
@@ -78,9 +78,9 @@ struct x25_subscrip_struct {
* Routing table control structure.
*/
struct x25_route_struct {
- x25_address address;
- unsigned int sigdigits;
- char device[200];
+ struct x25_address address;
+ unsigned int sigdigits;
+ char device[200];
};
/*
diff --git a/include/net/lapb.h b/include/net/lapb.h
index 7cc9b3452abb..50292be77a71 100644
--- a/include/net/lapb.h
+++ b/include/net/lapb.h
@@ -78,8 +78,8 @@ struct lapb_frame {
/*
* The per LAPB connection control structure.
*/
-typedef struct lapb_cb {
- struct lapb_cb *next;
+struct lapb_cb {
+ struct list_head node;
void *token;
/* Link status fields */
@@ -100,43 +100,45 @@ typedef struct lapb_cb {
/* FRMR control information */
struct lapb_frame frmr_data;
unsigned char frmr_type;
-} lapb_cb;
+
+ atomic_t refcnt;
+};
/* lapb_iface.c */
-extern void lapb_connect_confirmation(lapb_cb *, int);
-extern void lapb_connect_indication(lapb_cb *, int);
-extern void lapb_disconnect_confirmation(lapb_cb *, int);
-extern void lapb_disconnect_indication(lapb_cb *, int);
-extern int lapb_data_indication(lapb_cb *, struct sk_buff *);
-extern int lapb_data_transmit(lapb_cb *, struct sk_buff *);
+extern void lapb_connect_confirmation(struct lapb_cb *lapb, int);
+extern void lapb_connect_indication(struct lapb_cb *lapb, int);
+extern void lapb_disconnect_confirmation(struct lapb_cb *lapb, int);
+extern void lapb_disconnect_indication(struct lapb_cb *lapb, int);
+extern int lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *);
+extern int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *);
/* lapb_in.c */
-extern void lapb_data_input(lapb_cb *, struct sk_buff *);
+extern void lapb_data_input(struct lapb_cb *lapb, struct sk_buff *);
/* lapb_out.c */
-extern void lapb_kick(lapb_cb *);
-extern void lapb_transmit_buffer(lapb_cb *, struct sk_buff *, int);
-extern void lapb_establish_data_link(lapb_cb *);
-extern void lapb_enquiry_response(lapb_cb *);
-extern void lapb_timeout_response(lapb_cb *);
-extern void lapb_check_iframes_acked(lapb_cb *, unsigned short);
-extern void lapb_check_need_response(lapb_cb *, int, int);
+extern void lapb_kick(struct lapb_cb *lapb);
+extern void lapb_transmit_buffer(struct lapb_cb *lapb, struct sk_buff *, int);
+extern void lapb_establish_data_link(struct lapb_cb *lapb);
+extern void lapb_enquiry_response(struct lapb_cb *lapb);
+extern void lapb_timeout_response(struct lapb_cb *lapb);
+extern void lapb_check_iframes_acked(struct lapb_cb *lapb, unsigned short);
+extern void lapb_check_need_response(struct lapb_cb *lapb, int, int);
/* lapb_subr.c */
-extern void lapb_clear_queues(lapb_cb *);
-extern void lapb_frames_acked(lapb_cb *, unsigned short);
-extern void lapb_requeue_frames(lapb_cb *);
-extern int lapb_validate_nr(lapb_cb *, unsigned short);
-extern void lapb_decode(lapb_cb *, struct sk_buff *, struct lapb_frame *);
-extern void lapb_send_control(lapb_cb *, int, int, int);
-extern void lapb_transmit_frmr(lapb_cb *);
+extern void lapb_clear_queues(struct lapb_cb *lapb);
+extern void lapb_frames_acked(struct lapb_cb *lapb, unsigned short);
+extern void lapb_requeue_frames(struct lapb_cb *lapb);
+extern int lapb_validate_nr(struct lapb_cb *lapb, unsigned short);
+extern void lapb_decode(struct lapb_cb *lapb, struct sk_buff *, struct lapb_frame *);
+extern void lapb_send_control(struct lapb_cb *lapb, int, int, int);
+extern void lapb_transmit_frmr(struct lapb_cb *lapb);
/* lapb_timer.c */
-extern void lapb_start_t1timer(lapb_cb *);
-extern void lapb_start_t2timer(lapb_cb *);
-extern void lapb_stop_t1timer(lapb_cb *);
-extern void lapb_stop_t2timer(lapb_cb *);
-extern int lapb_t1timer_running(lapb_cb *);
+extern void lapb_start_t1timer(struct lapb_cb *lapb);
+extern void lapb_start_t2timer(struct lapb_cb *lapb);
+extern void lapb_stop_t1timer(struct lapb_cb *lapb);
+extern void lapb_stop_t2timer(struct lapb_cb *lapb);
+extern int lapb_t1timer_running(struct lapb_cb *lapb);
/*
* Debug levels.
diff --git a/include/net/x25.h b/include/net/x25.h
index 4d5c3a84e9dc..a043f5e093c8 100644
--- a/include/net/x25.h
+++ b/include/net/x25.h
@@ -101,26 +101,36 @@ enum {
#define X25_MAX_FAC_LEN 20 /* Plenty to spare */
#define X25_MAX_CUD_LEN 128
+/**
+ * struct x25_route - x25 routing entry
+ * @node - entry in x25_list_lock
+ * @address - Start of address range
+ * @sigdigits - Number of sig digits
+ * @dev - More than one for MLP
+ * @refcnt - reference counter
+ */
struct x25_route {
- struct x25_route *next;
- x25_address address; /* Start of address range */
- unsigned int sigdigits; /* Number of sig digits */
- struct net_device *dev; /* More than one for MLP */
+ struct list_head node;
+ struct x25_address address;
+ unsigned int sigdigits;
+ struct net_device *dev;
+ atomic_t refcnt;
};
struct x25_neigh {
- struct x25_neigh *next;
- struct net_device *dev;
+ struct list_head node;
+ struct net_device *dev;
unsigned int state;
unsigned int extended;
struct sk_buff_head queue;
unsigned long t20;
struct timer_list t20timer;
unsigned long global_facil_mask;
+ atomic_t refcnt;
};
-typedef struct {
- x25_address source_addr, dest_addr;
+struct x25_opt {
+ struct x25_address source_addr, dest_addr;
struct x25_neigh *neighbour;
unsigned int lci;
unsigned char state, condition, qbitincl, intflag;
@@ -137,9 +147,9 @@ typedef struct {
struct x25_facilities facilities;
struct x25_calluserdata calluserdata;
unsigned long vc_facil_mask; /* inc_call facilities mask */
-} x25_cb;
+};
-#define x25_sk(__sk) ((x25_cb *)(__sk)->protinfo)
+#define x25_sk(__sk) ((struct x25_opt *)(__sk)->protinfo)
/* af_x25.c */
extern int sysctl_x25_restart_request_timeout;
@@ -148,8 +158,10 @@ extern int sysctl_x25_reset_request_timeout;
extern int sysctl_x25_clear_request_timeout;
extern int sysctl_x25_ack_holdback_timeout;
-extern int x25_addr_ntoa(unsigned char *, x25_address *, x25_address *);
-extern int x25_addr_aton(unsigned char *, x25_address *, x25_address *);
+extern int x25_addr_ntoa(unsigned char *, struct x25_address *,
+ struct x25_address *);
+extern int x25_addr_aton(unsigned char *, struct x25_address *,
+ struct x25_address *);
extern unsigned int x25_new_lci(struct x25_neigh *);
extern struct sock *x25_find_socket(unsigned int, struct x25_neigh *);
extern void x25_destroy_socket(struct sock *);
@@ -188,19 +200,42 @@ extern int x25_subscr_ioctl(unsigned int, void *);
extern struct x25_neigh *x25_get_neigh(struct net_device *);
extern void x25_link_free(void);
+/* x25_neigh.c */
+static __inline__ void x25_neigh_hold(struct x25_neigh *nb)
+{
+ atomic_inc(&nb->refcnt);
+}
+
+static __inline__ void x25_neigh_put(struct x25_neigh *nb)
+{
+ if (atomic_dec_and_test(&nb->refcnt))
+ kfree(nb);
+}
+
/* x25_out.c */
extern int x25_output(struct sock *, struct sk_buff *);
extern void x25_kick(struct sock *);
extern void x25_enquiry_response(struct sock *);
/* x25_route.c */
-extern struct net_device *x25_get_route(x25_address *);
+extern struct x25_route *x25_get_route(struct x25_address *addr);
extern struct net_device *x25_dev_get(char *);
extern void x25_route_device_down(struct net_device *);
extern int x25_route_ioctl(unsigned int, void *);
extern int x25_routes_get_info(char *, char **, off_t, int);
extern void x25_route_free(void);
+static __inline__ void x25_route_hold(struct x25_route *rt)
+{
+ atomic_inc(&rt->refcnt);
+}
+
+static __inline__ void x25_route_put(struct x25_route *rt)
+{
+ if (atomic_dec_and_test(&rt->refcnt))
+ kfree(rt);
+}
+
/* x25_subr.c */
extern void x25_clear_queues(struct sock *);
extern void x25_frames_acked(struct sock *, unsigned short);