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)); } } }
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); } } } } } } }