/* * Don't learn certain addresses. */ bool mroute_learnable_address (const struct mroute_addr *addr) { int i; bool not_all_zeros = false; bool not_all_ones = false; for (i = 0; i < addr->len; ++i) { int b = addr->addr[i]; if (b != 0x00) not_all_zeros = true; if (b != 0xFF) not_all_ones = true; } return not_all_zeros && not_all_ones && !is_mac_mcast_maddr (addr); }
/* * Don't learn certain addresses. */ bool mroute_learnable_address(const struct mroute_addr *addr, struct gc_arena *gc) { int i; bool all_zeros = true; bool all_ones = true; for (i = 0; i < addr->len; ++i) { int b = addr->raw_addr[i]; if (b != 0x00) { all_zeros = false; } if (b != 0xFF) { all_ones = false; } } /* only networkss shorter than 8 bits are allowed to be all 0s. */ if (all_zeros && !((addr->type & MR_WITH_NETBITS) && (addr->netbits < 8))) { msg(D_MULTI_LOW, "Can't learn %s: network is all 0s, but netbits >= 8", mroute_addr_print(addr, gc)); return false; } if (all_ones) { msg(D_MULTI_LOW, "Can't learn %s: network is all 1s", mroute_addr_print(addr, gc)); return false; } if (is_mac_mcast_maddr(addr)) { msg(D_MULTI_LOW, "Can't learn %s: network is a multicast address", mroute_addr_print(addr, gc)); return false; } return true; }