* Copyright (c) 1992 Regents of the University of California.
* %sccs.include.redist.c%
* @(#)tuba_table.c 7.12 (Berkeley) %G%
#include <sys/socketvar.h>
#include <netiso/tuba_table.h>
struct tuba_cache
**tuba_table
;
struct radix_node_head
*tuba_tree
;
extern int arpt_keep
, arpt_prune
; /* use same values as arp cache */
register struct tuba_cache
*tc
;
long timelimit
= time
.tv_sec
- arpt_keep
;
timeout(tuba_timer
, (caddr_t
)0, arpt_prune
* hz
);
for (i
= tuba_table_size
; i
> 0; i
--)
if ((tc
= tuba_table
[i
]) && (tc
->tc_refcnt
== 0) &&
(tc
->tc_time
< timelimit
)) {
rn_delete((caddr_t
)&tc
->tc_siso
.siso_addr
, (caddr_t
)0,
free((caddr_t
)tc
, M_RTABLE
);
rn_inithead((void **)&tuba_tree
, 40);
timeout(tuba_timer
, (caddr_t
)0, arpt_prune
* hz
);
register struct sockaddr_iso
*siso
;
struct radix_node
*rn
, *rn_match();
register struct tuba_cache
*tc
;
int dupentry
= 0, sum_a
= 0, sum_b
= 0, old_size
, i
;
if ((rn
= rn_match((caddr_t
)&siso
->siso_addr
, tuba_tree
->rnh_treetop
))
&& ((rn
->rn_flags
& RNF_ROOT
) == 0)) {
tc
= (struct tuba_cache
*)rn
;
tc
->tc_time
= time
.tv_sec
;
if ((tc
= (struct tuba_cache
*)malloc(sizeof(*tc
), M_RTABLE
, wait
))
bzero((caddr_t
)tc
, sizeof (*tc
));
bcopy(siso
->siso_data
, tc
->tc_siso
.siso_data
,
tc
->tc_siso
.siso_nlen
= siso
->siso_nlen
);
rn_insert((caddr_t
)&tc
->tc_siso
.siso_addr
,
tuba_tree
->rnh_treetop
, &dupentry
, tc
->tc_nodes
);
tc
->tc_siso
.siso_family
= AF_ISO
;
tc
->tc_siso
.siso_len
= sizeof(tc
->tc_siso
);
tc
->tc_time
= time
.tv_sec
;
for (i
= sum_a
= tc
->tc_siso
.siso_nlen
; --i
>= 0; )
(i
& 1 ? sum_a
: sum_b
) += (u_char
)tc
->tc_siso
.siso_data
[i
];
REDUCE(tc
->tc_sum
, (sum_a
<< 8) + sum_b
);
SWAB(tc
->tc_ssum
, tc
->tc_sum
);
for (i
= tuba_table_size
; i
> 0; i
--)
old_size
= tuba_table_size
;
if (tuba_table_size
== 0)
if (tuba_table_size
> 0x7fff)
tuba_table_size
= 1 + 2 * tuba_table_size
;
i
= (tuba_table_size
+ 1) * sizeof(tc
);
new = (struct tuba_cache
**)malloc((unsigned)i
, M_RTABLE
, wait
);
tuba_table_size
= old_size
;
rn_delete((caddr_t
)&tc
->tc_siso
.siso_addr
,
(caddr_t
)0, tuba_tree
->rnh_treetop
);
free((caddr_t
)tc
, M_RTABLE
);
bzero((caddr_t
)new, (unsigned)i
);
bcopy((caddr_t
)tuba_table
, (caddr_t
)new, i
>> 1);
free((caddr_t
)tuba_table
, M_RTABLE
);