diff options
| author | Arnaldo Carvalho de Melo <acme@hera.kernel.org> | 2002-09-29 00:39:46 -0700 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@hera.kernel.org> | 2002-09-29 00:39:46 -0700 |
| commit | 5c0fbae16feb334cc28a74dffbd09c2c6063290b (patch) | |
| tree | 5e597781b2ed2ddceaaae572576e8879ca34c010 /include/net | |
| parent | 536ce36260adc007ce0a5b27786cbb8f5bcc72f4 (diff) | |
| parent | 004ffedc473a504ab1bad9cfe41ba3359a2f8297 (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/net')
| -rw-r--r-- | include/net/lapb.h | 60 | ||||
| -rw-r--r-- | include/net/x25.h | 61 |
2 files changed, 79 insertions, 42 deletions
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); |
