-/*
- * FUNCTION: iso_ifinit
- *
- * PURPOSE: Initialize an interface's iso address and
- * routing table entry.
- *
- * RETURNS: unix error code
- *
- * SIDE EFFECTS:
- *
- * NOTES:
- */
-iso_ifinit(ifp, ia, siso)
-register struct ifnet *ifp; /* interface to initialize */
-register struct iso_ifaddr *ia; /* addr on ifnet list */
-struct sockaddr_iso *siso; /* address to use */
-{
- struct sockaddr oldaddr;
- struct sockaddr_iso netaddr;
- int s = splimp(), error;
-
- /*
- * Make sure the address make sense
- */
- if (!iso_ck_addr(&siso->siso_addr))
- return(EINVAL);
- IFDEBUG(D_ROUTE)
- int i;
- char *ptr;
-
- ptr = (char *) siso;
- printf("The size of sockaddr_iso is %d\n",
- sizeof(struct sockaddr_iso));
- for(i=0; i< sizeof(struct sockaddr_iso); i++) {
- printf("sockaddr[%d] = 0x%x\n", i, *ptr++ & 0xff);
- }
- ENDDEBUG
-
- oldaddr = ia->ia_addr;
- ia->ia_addr = *(struct sockaddr *)siso;
- bzero((caddr_t)&netaddr, sizeof (netaddr));
- netaddr.siso_family = AF_ISO;
-
- /*
- * Give the interface a chance to initialize
- */
- if (ifp->if_ioctl && (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) {
- splx(s);
- ia->ia_addr = oldaddr;
- return (error);
- }
- splx(s);
-
- /*
- * Add route for the network.
- */
- if (ifp->if_flags & IFF_LOOPBACK)
- rtinit(&ia->ia_addr, &ia->ia_addr, (int)SIOCADDRT, RTF_HOST|RTF_UP);
- else {
- int len;
-
- len = iso_netof(&siso->siso_addr, (caddr_t)&netaddr.siso_addr);
- netaddr.siso_addr.isoa_len = len;
- rtinit((struct sockaddr *)&netaddr, &ia->ia_addr,
- (int)SIOCADDRT, RTF_UP);
- }
- ia->ia_flags |= IFA_ROUTE;
- return (0);
-}
-
-
-/*
- * FUNCTION: iso_ifdelete
- *
- * PURPOSE: Delete an iso address from an interface.
- *
- * RETURNS: 0 or unix error code
- *
- * SIDE EFFECTS:
- *
- * NOTES:
- */
-iso_ifdelete(ifp, siso)
-struct ifnet *ifp; /* interface to delete addr from */
-struct sockaddr_iso *siso; /* address to delete */
-{
- struct iso_addr *isoa = &siso->siso_addr;
- register struct iso_ifaddr *ia, *prev = 0;
- register struct ifaddr *ifa;
- int s;
- struct sockaddr_iso netaddr;
-
- /*
- * Find the iso address of same type as specified and delete it.
- */
- for (ia = iso_ifaddr; ia; prev = ia, ia = ia->ia_next) {
- if (ia->ia_ifp == ifp) {
- if (iso_eqtype(&IA_SIS(ia)->siso_addr, isoa)) {
- /*
- * Delete any previous route for the address.
- */
- IFDEBUG(D_IOCTL)
- printf("iso_ifdelete: delete %s\n", clnp_iso_addrp(isoa))
- ENDDEBUG
- s = splimp();
- bzero((caddr_t)&netaddr, sizeof (netaddr));
- netaddr.siso_family = AF_ISO;
- if (ia->ia_flags & IFA_ROUTE) {
- if (ifp->if_flags & IFF_LOOPBACK)
- rtinit(&ia->ia_addr, &ia->ia_addr, (int)SIOCDELRT,
- RTF_HOST);
- else {
- (void) iso_netof(&siso->siso_addr,
- (caddr_t)&netaddr.siso_addr);
- rtinit((struct sockaddr *)&netaddr, &ia->ia_addr,
- (int)SIOCDELRT, 0);
- }
- ia->ia_flags &= ~IFA_ROUTE;
- }
- splx(s);
-
- /*
- * Remove from list of iso addresses
- */
- if (prev == 0)
- iso_ifaddr = ia->ia_next;
- else
- prev->ia_next = ia->ia_next;
- if (ifp != &loif)
- iso_interfaces--;
-
- /*
- * Remove from list of addrs on ifnet structure
- */
- if ((ifa = ifp->if_addrlist) == (struct ifaddr *)ia)
- ifp->if_addrlist = ia->ia_ifa.ifa_next;
- else {
- for (; ifa; ifa = ifa->ifa_next) {
- if (ifa->ifa_next == (struct ifaddr *)ia) {
- ifa->ifa_next = ia->ia_ifa.ifa_next;
- break;
- }
- }
- }
-
- /*
- * Free the iso_ifaddr mbuf
- */
- m_free(dtom(ia));
- return (0);
- }
- }
- }
- return(EADDRNOTAVAIL);
-}
-