void bridge_addrs_dump(struct bridge_if *bif) { struct tp_entry *te; syslog(LOG_ERR, "Addresses count - %d", bif->num_addrs); for (te = bridge_addrs_bif_first(bif); te != NULL; te = bridge_addrs_bif_next(te)) { syslog(LOG_ERR, "address %x:%x:%x:%x:%x:%x on port %d.%d", te->tp_addr[0], te->tp_addr[1], te->tp_addr[2], te->tp_addr[3], te->tp_addr[4], te->tp_addr[5], te->sysindex, te->port_no); } }
/* * Update the addresses for the bridge interface. */ int bridge_update_addrs(struct bridge_if *bif) { int added, updated; uint32_t i; int32_t buf_len; struct tp_entry *te, *te_next; struct ifbareq *addr_req_buf, *addr_req; if ((buf_len = bridge_addrs_getinfo_ifalist(bif, &addr_req_buf)) < 0) return (-1); added = updated = 0; #define BA_FOUND 0x01 for (i = 0; i < buf_len / sizeof(struct ifbareq); i++) { addr_req = addr_req_buf + i; if ((te = bridge_addrs_find(addr_req->ifba_dst, bif)) == NULL) { added++; if ((te = bridge_new_addrs(addr_req->ifba_dst, bif)) == NULL) continue; } else updated++; bridge_addrs_info_ifaddrlist(addr_req, te); te-> flags |= BA_FOUND; } free(addr_req_buf); for (te = bridge_addrs_bif_first(bif); te != NULL; te = te_next) { te_next = bridge_addrs_bif_next(te); if ((te-> flags & BA_FOUND) == 0) bridge_addrs_remove(te, bif); else te-> flags &= ~BA_FOUND; } #undef BA_FOUND bif->addrs_age = time(NULL); return (updated + added); }
/* * Find the next address entry for the SNMP index * from the default bridge only. */ static struct tp_entry * bridge_addrs_getnext(const struct asn_oid *oid, uint sub, struct bridge_if *bif) { int i; uint8_t tp_addr[ETHER_ADDR_LEN]; static struct tp_entry *te; if (oid->len - sub == 0) return (bridge_addrs_bif_first(bif)); if (oid->len - sub != ETHER_ADDR_LEN + 1 || oid->subs[sub] != ETHER_ADDR_LEN) return (NULL); for (i = 0; i < ETHER_ADDR_LEN; i++) tp_addr[i] = oid->subs[sub + i + 1]; if ((te = bridge_addrs_find(tp_addr, bif)) == NULL) return (NULL); return (bridge_addrs_bif_next(te)); }