/* Remove virtual IP interfaces from the system. */
void ssh_vxworks_virtual_adapter_uninit(void)
{
  VxWorksVa *va;
  int i;
  STATUS status;

  for (i = 0; i < vxworks_va_num; i++)
    {
      va = &vxworks_va_tab[i];

      if (!va->cookie)
        continue;

#if defined(WITH_IPV6) && defined(INET6)
      if (ip6Detach(i, vxworks_va_devname) != OK)
        SSH_TRACE(SSH_D_ERROR, ("%s: ip6Detach failed", va->name));
#endif /* defined(WITH_IPV6) && defined(INET6) */

      if (ipDetach(i, vxworks_va_devname) != OK)
        SSH_TRACE(SSH_D_ERROR, ("%s: ipDetach failed", va->name));

      if ((status = muxDevStop(va->cookie)) != OK)
        SSH_TRACE(
          SSH_D_ERROR,
          ("%s: muxDevStop failed, status %d", va->name, (int)status));

      if ((status = muxDevUnload(vxworks_va_devname, i)) != OK)
        SSH_TRACE(
          SSH_D_ERROR,
          ("%s: muxDevUnload failed, status %d", va->name, (int)status));

      va->cookie = NULL;
    }
}
Exemple #2
0
Fichier : if.c Projet : ariavie/bcm
static int
sal_if_do_deconfig(char *pfx, END_OBJ *eo, char *if_name, int if_unit)
/*
 * Function: 
 * Purpose:
 * Parameters:
 * Returns:
 */
{
#if VX_VERSION == 66 || VX_VERSION == 68
    char ifconfigstr[32];
#endif /* VX_VERSION == 66 || VX_VERSION == 68 */

    LOG_INFO(BSL_LS_APPL_END,
             (BSL_META("%s: Stopping %s %d %08x \n"),
              pfx, if_name, if_unit, (uint32)eo));
    if (OK != muxDevStop(eo)) {
	cli_out("%s: Error: muxDevStop failed: %s%d\n", 
                pfx, if_name, if_unit);
	return(-1);
    }

#if VX_VERSION == 66 || VX_VERSION == 68
    sprintf(ifconfigstr, "%s%d down", if_name, if_unit);
    if (ERROR == ifconfig(ifconfigstr)) {
        cli_out("%s: ifconfig down failed: %s%d <-- %s\n", pfx, if_name, if_unit, ifconfigstr);
        return(-1);
    }

    sprintf(ifconfigstr, "%s%d detach", if_name, if_unit);
    if (ERROR == ifconfig(ifconfigstr)) {
        cli_out("%s: ifconfig down failed: %s%d <-- %s\n", pfx, if_name, if_unit, ifconfigstr);
        return(-1);
    }
#else /* VX_VERSION == 66 || VX_VERSION == 68 */

    LOG_INFO(BSL_LS_APPL_END,
             (BSL_META("%s: Clearing Routes\n"), pfx));

#ifdef VXWORKS_NETWORK_STACK_6_5
#ifdef VXWORKS_NETWORK_STACK_FIXME_SHOW
#error VXWORKS_NETWORK_STACK_FIXME_SHOW
#endif 
#else
    ifRouteDelete(if_name, if_unit);
#endif /* VXWORKS_NETWORK_STACK_6_5 */

    LOG_INFO(BSL_LS_APPL_END,
             (BSL_META("%s: Unloading\n"), pfx));
    if (OK != muxDevUnload(if_name, if_unit)) {
	cli_out("%s: Error: muxDevUnload failed: %s%d\n",
                pfx, if_name, if_unit);
	return(-1);
    }
    LOG_INFO(BSL_LS_APPL_END,
             (BSL_META("%s: Stopped and Unloaded: %s%d\n"), 
              pfx, if_name, if_unit));
#endif /* VX_VERSION == 66 || VX_VERSION == 68 */
    return(0);
}
/* Add virtual IP interfaces to the system. */
void ssh_vxworks_virtual_adapter_init(void)
{
  VxWorksVa *va;
  STATUS status;
  int i, started, ip_attached;
  void *cookie;
  unsigned short if_index;

  vxworks_va_nettask = taskIdSelf();

  for (i = 0; i < vxworks_va_num; i++)
    {
      va = &vxworks_va_tab[i];
      started = 0;
      ip_attached = 0;

      memset(va, 0, sizeof *va);

      ssh_snprintf(va->name, sizeof va->name, "%s%d", vxworks_va_devname, i);

      memset(va->enet_addr, 0, sizeof va->enet_addr);
      memcpy(va->enet_addr, vxworks_va_oui, sizeof vxworks_va_oui);
      va->enet_addr[sizeof va->enet_addr - 1] = (unsigned char)i;

      if (!(cookie = muxDevLoad(i, vxworks_va_load, "", FALSE, va)))
        {
          SSH_TRACE(SSH_D_ERROR, ("%s: muxDevLoad failed", va->name));
          goto fail;
        }

      if ((status = muxDevStart(cookie)) != OK)
        {
          SSH_TRACE(
            SSH_D_ERROR,
            ("%s: muxDevStart failed, status %d", va->name, (int)status));
          goto fail;
        }
      started = 1;

      if (ipAttach(i, vxworks_va_devname) != OK)
        {
          SSH_TRACE(SSH_D_ERROR, ("%s: ipAttach failed", va->name));
          goto fail;
        }
      ip_attached = 1;

#if defined(WITH_IPV6) && defined(INET6)
      if (ip6Attach(i, vxworks_va_devname) != OK)
        {
          SSH_TRACE(SSH_D_ERROR, ("%s: ip6Attach failed", va->name));
          goto fail;
        }
#endif /* defined(WITH_IPV6) && defined(INET6) */

      if (!(if_index = ifNameToIfIndex(va->name)))
        {
          SSH_TRACE(
            SSH_D_ERROR,
            ("%s: cannot get interface index after IP attach", va->name));
          goto fail;
        }

      va->ifnum = if_index - 1;
      va->cookie = cookie;

      continue;

    fail:
      if (ip_attached)
        ipDetach(i, vxworks_va_devname);

      if (started)
        muxDevStop(cookie);

      if (cookie)
        muxDevUnload(vxworks_va_devname, i);
    }
}