+static struct genl_family *
+find_genl_family_by_id(uint16_t id)
+{
+ struct genl_family *family;
+
+ HMAP_FOR_EACH_IN_BUCKET (family, hmap_node, hash_int(id, 0),
+ &genl_families) {
+ if (family->id == id) {
+ return family;
+ }
+ }
+ return NULL;
+}
+
+static void
+define_genl_family(uint16_t id, const char *name)
+{
+ struct genl_family *family = find_genl_family_by_id(id);
+
+ if (family) {
+ if (!strcmp(family->name, name)) {
+ return;
+ }
+ free(family->name);
+ } else {
+ family = xmalloc(sizeof *family);
+ family->id = id;
+ hmap_insert(&genl_families, &family->hmap_node, hash_int(id, 0));
+ }
+ family->name = xstrdup(name);
+}
+
+static const char *
+genl_family_to_name(uint16_t id)
+{
+ if (id == GENL_ID_CTRL) {
+ return "control";
+ } else {
+ struct genl_family *family = find_genl_family_by_id(id);
+ return family ? family->name : "unknown";
+ }
+}
+