2 #include <sys/stream.h>
3 #include <sys/socket.h>
6 #include <sys/cmn_err.h>
8 #include <sys/ethernet.h>
13 #include <netatalk/at.h>
18 static struct sock_data *sockets = NULL;
21 sock_alloc( queue_t *q )
25 if (( sd = kmem_alloc( sizeof( struct sock_data ), KM_SLEEP )) == NULL ) {
28 sd->sd_state = TS_UNBND;
30 sd->sd_next = sd->sd_prev = NULL;
31 bzero( (caddr_t)&sd->sd_sat, sizeof( struct sockaddr_at ));
33 sd->sd_next = sockets;
34 if ( sockets != NULL ) {
35 sockets->sd_prev = sd;
43 sock_free( struct sock_data *sd )
45 if ( sd == sockets ) {
46 sockets = sd->sd_next;
48 if ( sd->sd_next != NULL ) {
49 sd->sd_next->sd_prev = sd->sd_prev;
51 if ( sd->sd_prev != NULL ) {
52 sd->sd_prev->sd_next = sd->sd_next;
54 kmem_free( sd, sizeof( struct sock_data ));
59 sock_dest( struct atif_data *aid, struct sockaddr_at *sat )
63 for ( sd = sockets; sd != NULL; sd = sd->sd_next ) {
64 if ( sat->sat_port == sd->sd_sat.sat_port &&
66 aid->aid_sat.sat_addr.s_net == sd->sd_sat.sat_addr.s_net &&
67 ( sat->sat_addr.s_node == sd->sd_sat.sat_addr.s_node ||
68 sat->sat_addr.s_node == ATADDR_BCAST )) {
76 * This is a change in semantics. The port must be ATADDR_ANYPORT for
77 * ATADDR_ANYNET/NODE to not mean the loopback.
80 sock_bind( struct sock_data *sd, struct sockaddr_at *sat )
82 struct atif_data *paid;
83 struct sock_data *psd;
84 struct sockaddr_at psat;
88 if ( psat.sat_family != AF_APPLETALK ) {
89 cmn_err( CE_CONT, "sock_bind non-AppleTalk\n" );
93 if ( psat.sat_port == ATADDR_ANYPORT ) {
94 if ( psat.sat_addr.s_net == ATADDR_ANYNET &&
95 psat.sat_addr.s_node == ATADDR_ANYNODE ) {
96 /* chose primary interface */
97 if (( paid = if_primary()) == NULL ) {
98 return( EADDRNOTAVAIL );
100 psat.sat_addr.s_net = paid->aid_sat.sat_addr.s_net;
101 psat.sat_addr.s_node = paid->aid_sat.sat_addr.s_node;
104 /* pick unused port */
105 for ( port = ATPORT_RESERVED; port < ATPORT_LAST; port++ ) {
106 for ( psd = sockets; psd != NULL; psd = psd->sd_next ) {
107 if ( port == psd->sd_sat.sat_port &&
108 psat.sat_addr.s_net == psd->sd_sat.sat_addr.s_net &&
109 psat.sat_addr.s_node == psd->sd_sat.sat_addr.s_node ) {
118 return( EADDRINUSE );
120 psat.sat_port = port;
124 sd->sd_state = TS_IDLE;