static int ddp_bind(struct socket *so, struct sockaddr *nam, struct proc *p) { struct ddpcb *ddp; int error = 0; int s; ddp = sotoddpcb( so ); if ( ddp == NULL ) { return( EINVAL); } s = splnet(); error = at_pcbsetaddr(ddp, nam, p); splx(s); return (error); }
static int ddp_bind(struct socket *so, struct sockaddr *nam, struct thread *td) { struct ddpcb *ddp; int error = 0; ddp = sotoddpcb(so); KASSERT(ddp != NULL, ("ddp_bind: ddp == NULL")); DDP_LIST_XLOCK(); DDP_LOCK(ddp); error = at_pcbsetaddr(ddp, nam, td); DDP_UNLOCK(ddp); DDP_LIST_XUNLOCK(); return (error); }
static int at_pcbconnect(struct ddpcb *ddp, struct sockaddr *addr, struct proc *p) { struct sockaddr_at *sat = (struct sockaddr_at *)addr; struct route *ro; struct at_ifaddr *aa = 0; struct ifnet *ifp; u_short hintnet = 0, net; if (sat->sat_family != AF_APPLETALK) { return(EAFNOSUPPORT); } /* * Under phase 2, network 0 means "the network". We take "the * network" to mean the network the control block is bound to. * If the control block is not bound, there is an error. */ if ( sat->sat_addr.s_net == ATADDR_ANYNET && sat->sat_addr.s_node != ATADDR_ANYNODE ) { if ( ddp->ddp_lsat.sat_port == ATADDR_ANYPORT ) { return( EADDRNOTAVAIL ); } hintnet = ddp->ddp_lsat.sat_addr.s_net; } ro = &ddp->ddp_route; /* * If we've got an old route for this pcb, check that it is valid. * If we've changed our address, we may have an old "good looking" * route here. Attempt to detect it. */ if ( ro->ro_rt ) { if ( hintnet ) { net = hintnet; } else { net = sat->sat_addr.s_net; } aa = 0; if ((ifp = ro->ro_rt->rt_ifp) != NULL) { for ( aa = at_ifaddr; aa; aa = aa->aa_next ) { if ( aa->aa_ifp == ifp && ntohs( net ) >= ntohs( aa->aa_firstnet ) && ntohs( net ) <= ntohs( aa->aa_lastnet )) { break; } } } if ( aa == NULL || ( satosat( &ro->ro_dst )->sat_addr.s_net != ( hintnet ? hintnet : sat->sat_addr.s_net ) || satosat( &ro->ro_dst )->sat_addr.s_node != sat->sat_addr.s_node )) { RTFREE( ro->ro_rt ); ro->ro_rt = (struct rtentry *)0; } } /* * If we've got no route for this interface, try to find one. */ if ( ro->ro_rt == (struct rtentry *)0 || ro->ro_rt->rt_ifp == (struct ifnet *)0 ) { ro->ro_dst.sa_len = sizeof( struct sockaddr_at ); ro->ro_dst.sa_family = AF_APPLETALK; if ( hintnet ) { satosat( &ro->ro_dst )->sat_addr.s_net = hintnet; } else { satosat( &ro->ro_dst )->sat_addr.s_net = sat->sat_addr.s_net; } satosat( &ro->ro_dst )->sat_addr.s_node = sat->sat_addr.s_node; rtalloc( ro ); } /* * Make sure any route that we have has a valid interface. */ aa = 0; if ( ro->ro_rt && ( ifp = ro->ro_rt->rt_ifp )) { for ( aa = at_ifaddr; aa; aa = aa->aa_next ) { if ( aa->aa_ifp == ifp ) { break; } } } if ( aa == 0 ) { return( ENETUNREACH ); } ddp->ddp_fsat = *sat; if ( ddp->ddp_lsat.sat_port == ATADDR_ANYPORT ) { return(at_pcbsetaddr(ddp, (struct sockaddr *)0, p)); } return( 0 ); }