/* Generates and returns a random datapath id. */ static uint64_t gen_datapath_id(void) { uint8_t ea[ETH_ADDR_LEN]; eth_addr_random(ea); return eth_addr_to_uint64(ea); }
static struct pagthread_once once = PAGTHREAD_ONCE_INITIALIZER; struct eth_addr_node *node; static struct hmap addrs; uint64_t ea64; if (pagthread_once_start(&once)) { hmap_init(&addrs); for (node = nodes; node < &nodes[ARRAY_SIZE(nodes)]; node++) { hmap_insert(&addrs, &node->hmap_node, hash_2words(node->ea64, node->ea64 >> 32)); } pagthread_once_done(&once); } ea64 = eth_addr_to_uint64(ea); HMAP_FOR_EACH_IN_BUCKET (node, hmap_node, hash_2words(ea64, ea64 >> 32), &addrs) { if (node->ea64 == ea64) { return true; } } return false; } bool eth_addr_from_string(const char *s, uint8_t ea[ETH_ADDR_LEN]) { if (pag_scan(s, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea))) { return true; } else {