Lines Matching refs:family

89 static int genl_ctrl_event(int event, struct genl_family *family,
127 static const struct genl_ops *genl_get_cmd(u8 cmd, struct genl_family *family) in genl_get_cmd() argument
131 for (i = 0; i < family->n_ops; i++) in genl_get_cmd()
132 if (family->ops[i].cmd == cmd) in genl_get_cmd()
133 return &family->ops[i]; in genl_get_cmd()
220 static int genl_validate_assign_mc_groups(struct genl_family *family) in genl_validate_assign_mc_groups() argument
223 int n_groups = family->n_mcgrps; in genl_validate_assign_mc_groups()
231 const struct genl_multicast_group *grp = &family->mcgrps[i]; in genl_validate_assign_mc_groups()
240 if (family == &genl_ctrl) { in genl_validate_assign_mc_groups()
243 } else if (strcmp(family->name, "NET_DM") == 0) { in genl_validate_assign_mc_groups()
246 } else if (family->id == GENL_ID_VFS_DQUOT) { in genl_validate_assign_mc_groups()
249 } else if (family->id == GENL_ID_PMCRAID) { in genl_validate_assign_mc_groups()
259 family->mcgrp_offset = first_id; in genl_validate_assign_mc_groups()
265 if (family->netnsok) { in genl_validate_assign_mc_groups()
291 for (i = 0; i < family->n_mcgrps; i++) in genl_validate_assign_mc_groups()
292 clear_bit(family->mcgrp_offset + i, mc_groups); in genl_validate_assign_mc_groups()
298 static void genl_unregister_mc_groups(struct genl_family *family) in genl_unregister_mc_groups() argument
306 for (i = 0; i < family->n_mcgrps; i++) in genl_unregister_mc_groups()
308 net->genl_sock, family->mcgrp_offset + i); in genl_unregister_mc_groups()
313 for (i = 0; i < family->n_mcgrps; i++) { in genl_unregister_mc_groups()
314 int grp_id = family->mcgrp_offset + i; in genl_unregister_mc_groups()
318 genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, family, in genl_unregister_mc_groups()
319 &family->mcgrps[i], grp_id); in genl_unregister_mc_groups()
323 static int genl_validate_ops(const struct genl_family *family) in genl_validate_ops() argument
325 const struct genl_ops *ops = family->ops; in genl_validate_ops()
326 unsigned int n_ops = family->n_ops; in genl_validate_ops()
360 int __genl_register_family(struct genl_family *family) in __genl_register_family() argument
364 if (family->id && family->id < GENL_MIN_ID) in __genl_register_family()
367 if (family->id > GENL_MAX_ID) in __genl_register_family()
370 err = genl_validate_ops(family); in __genl_register_family()
376 if (genl_family_find_byname(family->name)) { in __genl_register_family()
381 if (family->id == GENL_ID_GENERATE) { in __genl_register_family()
389 family->id = newid; in __genl_register_family()
390 } else if (genl_family_find_byid(family->id)) { in __genl_register_family()
395 if (family->maxattr && !family->parallel_ops) { in __genl_register_family()
396 family->attrbuf = kmalloc((family->maxattr+1) * in __genl_register_family()
398 if (family->attrbuf == NULL) { in __genl_register_family()
403 family->attrbuf = NULL; in __genl_register_family()
405 err = genl_validate_assign_mc_groups(family); in __genl_register_family()
409 list_add_tail(&family->family_list, genl_family_chain(family->id)); in __genl_register_family()
413 genl_ctrl_event(CTRL_CMD_NEWFAMILY, family, NULL, 0); in __genl_register_family()
414 for (i = 0; i < family->n_mcgrps; i++) in __genl_register_family()
415 genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, family, in __genl_register_family()
416 &family->mcgrps[i], family->mcgrp_offset + i); in __genl_register_family()
435 int genl_unregister_family(struct genl_family *family) in genl_unregister_family() argument
441 list_for_each_entry(rc, genl_family_chain(family->id), family_list) { in genl_unregister_family()
442 if (family->id != rc->id || strcmp(rc->name, family->name)) in genl_unregister_family()
445 genl_unregister_mc_groups(family); in genl_unregister_family()
448 family->n_ops = 0; in genl_unregister_family()
454 kfree(family->attrbuf); in genl_unregister_family()
455 genl_ctrl_event(CTRL_CMD_DELFAMILY, family, NULL, 0); in genl_unregister_family()
497 struct genl_family *family, int flags, u8 cmd) in genlmsg_put() argument
502 nlh = nlmsg_put(skb, portid, seq, family->id, GENL_HDRLEN + in genlmsg_put()
503 family->hdrsize, flags); in genlmsg_put()
509 hdr->version = family->version; in genlmsg_put()
542 static int genl_family_rcv_msg(struct genl_family *family, in genl_family_rcv_msg() argument
554 if (!family->netnsok && !net_eq(net, &init_net)) in genl_family_rcv_msg()
557 hdrlen = GENL_HDRLEN + family->hdrsize; in genl_family_rcv_msg()
561 ops = genl_get_cmd(hdr->cmd, family); in genl_family_rcv_msg()
575 if (!family->parallel_ops) { in genl_family_rcv_msg()
577 .module = family->module, in genl_family_rcv_msg()
590 .module = family->module, in genl_family_rcv_msg()
604 if (family->maxattr && family->parallel_ops) { in genl_family_rcv_msg()
605 attrbuf = kmalloc((family->maxattr+1) * in genl_family_rcv_msg()
610 attrbuf = family->attrbuf; in genl_family_rcv_msg()
613 err = nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr, in genl_family_rcv_msg()
629 if (family->pre_doit) { in genl_family_rcv_msg()
630 err = family->pre_doit(ops, skb, &info); in genl_family_rcv_msg()
637 if (family->post_doit) in genl_family_rcv_msg()
638 family->post_doit(ops, skb, &info); in genl_family_rcv_msg()
641 if (family->parallel_ops) in genl_family_rcv_msg()
649 struct genl_family *family; in genl_rcv_msg() local
652 family = genl_family_find_byid(nlh->nlmsg_type); in genl_rcv_msg()
653 if (family == NULL) in genl_rcv_msg()
656 if (!family->parallel_ops) in genl_rcv_msg()
659 err = genl_family_rcv_msg(family, skb, nlh); in genl_rcv_msg()
661 if (!family->parallel_ops) in genl_rcv_msg()
686 static int ctrl_fill_info(struct genl_family *family, u32 portid, u32 seq, in ctrl_fill_info() argument
695 if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) || in ctrl_fill_info()
696 nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id) || in ctrl_fill_info()
697 nla_put_u32(skb, CTRL_ATTR_VERSION, family->version) || in ctrl_fill_info()
698 nla_put_u32(skb, CTRL_ATTR_HDRSIZE, family->hdrsize) || in ctrl_fill_info()
699 nla_put_u32(skb, CTRL_ATTR_MAXATTR, family->maxattr)) in ctrl_fill_info()
702 if (family->n_ops) { in ctrl_fill_info()
710 for (i = 0; i < family->n_ops; i++) { in ctrl_fill_info()
712 const struct genl_ops *ops = &family->ops[i]; in ctrl_fill_info()
736 if (family->n_mcgrps) { in ctrl_fill_info()
744 for (i = 0; i < family->n_mcgrps; i++) { in ctrl_fill_info()
748 grp = &family->mcgrps[i]; in ctrl_fill_info()
755 family->mcgrp_offset + i) || in ctrl_fill_info()
773 static int ctrl_fill_mcgrp_info(struct genl_family *family, in ctrl_fill_mcgrp_info() argument
786 if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) || in ctrl_fill_mcgrp_info()
787 nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id)) in ctrl_fill_mcgrp_info()
846 static struct sk_buff *ctrl_build_family_msg(struct genl_family *family, in ctrl_build_family_msg() argument
856 err = ctrl_fill_info(family, portid, seq, 0, skb, cmd); in ctrl_build_family_msg()
866 ctrl_build_mcgrp_msg(struct genl_family *family, in ctrl_build_mcgrp_msg() argument
877 err = ctrl_fill_mcgrp_info(family, grp, grp_id, portid, in ctrl_build_mcgrp_msg()
940 static int genl_ctrl_event(int event, struct genl_family *family, in genl_ctrl_event() argument
954 msg = ctrl_build_family_msg(family, 0, 0, event); in genl_ctrl_event()
959 msg = ctrl_build_mcgrp_msg(family, grp, grp_id, 0, 0, event); in genl_ctrl_event()
968 if (!family->netnsok) { in genl_ctrl_event()
1129 int genlmsg_multicast_allns(struct genl_family *family, struct sk_buff *skb, in genlmsg_multicast_allns() argument
1132 if (WARN_ON_ONCE(group >= family->n_mcgrps)) in genlmsg_multicast_allns()
1134 group = family->mcgrp_offset + group; in genlmsg_multicast_allns()
1139 void genl_notify(struct genl_family *family, struct sk_buff *skb, in genl_notify() argument
1149 if (WARN_ON_ONCE(group >= family->n_mcgrps)) in genl_notify()
1151 group = family->mcgrp_offset + group; in genl_notify()