1
/* $Id: sock.c,v 1.2 2002/01/17 07:11:13 srittau Exp $
6
#endif /* HAVE_CONFIG_H */
9
#include <sys/stream.h>
10
#include <sys/socket.h>
11
#include <sys/errno.h>
13
#include <sys/cmn_err.h>
14
#include <sys/tihdr.h>
15
#include <sys/ethernet.h>
24
#include <netatalk/at.h>
29
static struct sock_data *sockets = NULL;
32
sock_alloc( queue_t *q )
36
if (( sd = kmem_alloc( sizeof( struct sock_data ), KM_SLEEP )) == NULL ) {
39
sd->sd_state = TS_UNBND;
41
sd->sd_next = sd->sd_prev = NULL;
42
bzero( (caddr_t)&sd->sd_sat, sizeof( struct sockaddr_at ));
44
sd->sd_next = sockets;
45
if ( sockets != NULL ) {
46
sockets->sd_prev = sd;
54
sock_free( struct sock_data *sd )
56
if ( sd == sockets ) {
57
sockets = sd->sd_next;
59
if ( sd->sd_next != NULL ) {
60
sd->sd_next->sd_prev = sd->sd_prev;
62
if ( sd->sd_prev != NULL ) {
63
sd->sd_prev->sd_next = sd->sd_next;
65
kmem_free( sd, sizeof( struct sock_data ));
70
sock_dest( struct atif_data *aid, struct sockaddr_at *sat )
74
for ( sd = sockets; sd != NULL; sd = sd->sd_next ) {
75
if ( sat->sat_port == sd->sd_sat.sat_port &&
77
aid->aid_sat.sat_addr.s_net == sd->sd_sat.sat_addr.s_net &&
78
( sat->sat_addr.s_node == sd->sd_sat.sat_addr.s_node ||
79
sat->sat_addr.s_node == ATADDR_BCAST )) {
87
* This is a change in semantics. The port must be ATADDR_ANYPORT for
88
* ATADDR_ANYNET/NODE to not mean the loopback.
91
sock_bind( struct sock_data *sd, struct sockaddr_at *sat )
93
struct atif_data *paid;
94
struct sock_data *psd;
95
struct sockaddr_at psat;
99
if ( psat.sat_family != AF_APPLETALK ) {
100
cmn_err( CE_CONT, "sock_bind non-AppleTalk\n" );
101
return( EPROTOTYPE );
104
if ( psat.sat_port == ATADDR_ANYPORT ) {
105
if ( psat.sat_addr.s_net == ATADDR_ANYNET &&
106
psat.sat_addr.s_node == ATADDR_ANYNODE ) {
107
/* chose primary interface */
108
if (( paid = if_primary()) == NULL ) {
109
return( EADDRNOTAVAIL );
111
psat.sat_addr.s_net = paid->aid_sat.sat_addr.s_net;
112
psat.sat_addr.s_node = paid->aid_sat.sat_addr.s_node;
115
/* pick unused port */
116
for ( port = ATPORT_RESERVED; port < ATPORT_LAST; port++ ) {
117
for ( psd = sockets; psd != NULL; psd = psd->sd_next ) {
118
if ( port == psd->sd_sat.sat_port &&
119
psat.sat_addr.s_net == psd->sd_sat.sat_addr.s_net &&
120
psat.sat_addr.s_node == psd->sd_sat.sat_addr.s_node ) {
129
return( EADDRINUSE );
131
psat.sat_port = port;
135
sd->sd_state = TS_IDLE;