Beispiel #1
0
void
count_ifNumber(int32_t *ifNumber) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  size_t v;
  if (ifNumber != NULL) {
    struct port_stat *port_stat;
    if ((ret = dp_get_port_stat(&port_stat)) == LAGOPUS_RESULT_OK) {
      dataplane_count_ifNumber(port_stat, &v);
      *ifNumber = (int32_t)v;
      port_stat_release(port_stat);
      free(port_stat);
    } else {
      lagopus_msg_error("cannot count ports: %s\n",
                        lagopus_error_get_string(ret));
    }
  }
}
Beispiel #2
0
static void
check_status_and_send_traps(void) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  struct port_stat *port_stat;
  size_t index;
  char ifname[IFNAMSIZ + 1];
  size_t len = 0;
  struct ifTable_entry *entry = NULL;
  int32_t ifAdminStatus, ifOperStatus;
  int32_t old_ifAdminStatus, old_ifOperStatus;

  if ((ret = dp_get_port_stat(&port_stat)) == LAGOPUS_RESULT_OK) {
    /* check each port_stat, send trap if needed! */
    for (index = 0;
         dataplane_interface_get_ifDescr(
           port_stat, index, ifname, &len) == LAGOPUS_RESULT_OK;
         index++) {
      if (len > 0) {
        int32_t ifIndex = (int32_t) (index + 1);
        if (dataplane_interface_get_ifAdminStatus(
              port_stat, index, &ifAdminStatus) == LAGOPUS_RESULT_OK
            && dataplane_interface_get_ifOperStatus(
              port_stat, index, &ifOperStatus) == LAGOPUS_RESULT_OK) {
          /* Note:
           *  index may be changed if a port is attached/detacched to vSwitch,
           *  so use ifName as key.
           */
          ret = lagopus_hashmap_find(&iftable_entry_hash,
                                     (void *)ifname,
                                     (void *)&entry);
          if (ret == LAGOPUS_RESULT_OK) {
            old_ifAdminStatus = entry->ifAdminStatus;
            old_ifOperStatus = entry->ifOperStatus;
            entry->ifAdminStatus = ifAdminStatus;
            entry->ifOperStatus = ifOperStatus;
            if (ifOperStatus != old_ifOperStatus) {
              /* operation status prior to administration status */
              if (ifOperStatus == up) { /* is up */
                (void)send_linkUp_trap(ifIndex, ifAdminStatus, ifOperStatus);
              } else if (ifOperStatus != up && old_ifOperStatus == up) {
                (void)send_linkDown_trap(ifIndex, ifAdminStatus, ifOperStatus);
              }
            } else if (ifAdminStatus != old_ifAdminStatus) {
              if (ifAdminStatus == up) {
                (void)send_linkUp_trap(ifIndex, ifAdminStatus, ifOperStatus);
              } else if (ifAdminStatus != up && old_ifAdminStatus == up) {
                (void)send_linkDown_trap(ifIndex, ifAdminStatus, ifOperStatus);
              }
            }
          } else {
            /* The entry does not exist in previous status checking, */
            /* so the port_stat is attached recentry. */
            if (ifOperStatus == up) {
              (void)send_linkUp_trap(ifIndex, ifAdminStatus, ifOperStatus);
            }
            if ((entry = (struct ifTable_entry *)
                         malloc (sizeof(*entry))) != NULL) {
              entry->ifAdminStatus = ifAdminStatus;
              entry->ifOperStatus = ifOperStatus;
              if ((ret = lagopus_hashmap_add(&iftable_entry_hash,
                                             (void *)ifname,
                                             (void **)&entry, false))
                  != LAGOPUS_RESULT_OK) {
                lagopus_perror(ret);
                free(entry);
              }
            } else {
              lagopus_perror(LAGOPUS_RESULT_NO_MEMORY);
            }
          }
        }
      }
    }
  }
}