• Home
  • Raw
  • Download

Lines Matching refs:family

89 static int genl_ctrl_event(int event, const struct genl_family *family,
100 const struct genl_family *family; in genl_family_find_byname() local
103 idr_for_each_entry(&genl_fam_idr, family, id) in genl_family_find_byname()
104 if (strcmp(family->name, name) == 0) in genl_family_find_byname()
105 return family; in genl_family_find_byname()
111 const struct genl_family *family) in genl_get_cmd() argument
115 for (i = 0; i < family->n_ops; i++) in genl_get_cmd()
116 if (family->ops[i].cmd == cmd) in genl_get_cmd()
117 return &family->ops[i]; in genl_get_cmd()
184 static int genl_validate_assign_mc_groups(struct genl_family *family) in genl_validate_assign_mc_groups() argument
187 int n_groups = family->n_mcgrps; in genl_validate_assign_mc_groups()
195 const struct genl_multicast_group *grp = &family->mcgrps[i]; in genl_validate_assign_mc_groups()
204 if (family == &genl_ctrl) { in genl_validate_assign_mc_groups()
207 } else if (strcmp(family->name, "NET_DM") == 0) { in genl_validate_assign_mc_groups()
210 } else if (family->id == GENL_ID_VFS_DQUOT) { in genl_validate_assign_mc_groups()
213 } else if (family->id == GENL_ID_PMCRAID) { in genl_validate_assign_mc_groups()
223 family->mcgrp_offset = first_id; in genl_validate_assign_mc_groups()
229 if (family->netnsok) { in genl_validate_assign_mc_groups()
255 for (i = 0; i < family->n_mcgrps; i++) in genl_validate_assign_mc_groups()
256 clear_bit(family->mcgrp_offset + i, mc_groups); in genl_validate_assign_mc_groups()
262 static void genl_unregister_mc_groups(const struct genl_family *family) in genl_unregister_mc_groups() argument
270 for (i = 0; i < family->n_mcgrps; i++) in genl_unregister_mc_groups()
272 net->genl_sock, family->mcgrp_offset + i); in genl_unregister_mc_groups()
277 for (i = 0; i < family->n_mcgrps; i++) { in genl_unregister_mc_groups()
278 int grp_id = family->mcgrp_offset + i; in genl_unregister_mc_groups()
282 genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, family, in genl_unregister_mc_groups()
283 &family->mcgrps[i], grp_id); in genl_unregister_mc_groups()
287 static int genl_validate_ops(const struct genl_family *family) in genl_validate_ops() argument
289 const struct genl_ops *ops = family->ops; in genl_validate_ops()
290 unsigned int n_ops = family->n_ops; in genl_validate_ops()
322 int genl_register_family(struct genl_family *family) in genl_register_family() argument
327 err = genl_validate_ops(family); in genl_register_family()
333 if (genl_family_find_byname(family->name)) { in genl_register_family()
345 if (family == &genl_ctrl) { in genl_register_family()
348 } else if (strcmp(family->name, "pmcraid") == 0) { in genl_register_family()
350 } else if (strcmp(family->name, "VFS_DQUOT") == 0) { in genl_register_family()
354 if (family->maxattr && !family->parallel_ops) { in genl_register_family()
355 family->attrbuf = kmalloc_array(family->maxattr + 1, in genl_register_family()
358 if (family->attrbuf == NULL) { in genl_register_family()
363 family->attrbuf = NULL; in genl_register_family()
365 family->id = idr_alloc_cyclic(&genl_fam_idr, family, in genl_register_family()
367 if (family->id < 0) { in genl_register_family()
368 err = family->id; in genl_register_family()
372 err = genl_validate_assign_mc_groups(family); in genl_register_family()
379 genl_ctrl_event(CTRL_CMD_NEWFAMILY, family, NULL, 0); in genl_register_family()
380 for (i = 0; i < family->n_mcgrps; i++) in genl_register_family()
381 genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, family, in genl_register_family()
382 &family->mcgrps[i], family->mcgrp_offset + i); in genl_register_family()
387 idr_remove(&genl_fam_idr, family->id); in genl_register_family()
389 kfree(family->attrbuf); in genl_register_family()
404 int genl_unregister_family(const struct genl_family *family) in genl_unregister_family() argument
408 if (!genl_family_find_byid(family->id)) { in genl_unregister_family()
413 genl_unregister_mc_groups(family); in genl_unregister_family()
415 idr_remove(&genl_fam_idr, family->id); in genl_unregister_family()
422 kfree(family->attrbuf); in genl_unregister_family()
424 genl_ctrl_event(CTRL_CMD_DELFAMILY, family, NULL, 0); in genl_unregister_family()
442 const struct genl_family *family, int flags, u8 cmd) in genlmsg_put() argument
447 nlh = nlmsg_put(skb, portid, seq, family->id, GENL_HDRLEN + in genlmsg_put()
448 family->hdrsize, flags); in genlmsg_put()
454 hdr->version = family->version; in genlmsg_put()
501 static int genl_family_rcv_msg(const struct genl_family *family, in genl_family_rcv_msg() argument
514 if (!family->netnsok && !net_eq(net, &init_net)) in genl_family_rcv_msg()
517 hdrlen = GENL_HDRLEN + family->hdrsize; in genl_family_rcv_msg()
521 ops = genl_get_cmd(hdr->cmd, family); in genl_family_rcv_msg()
540 int hdrlen = GENL_HDRLEN + family->hdrsize; in genl_family_rcv_msg()
545 if (family->maxattr) { in genl_family_rcv_msg()
553 family->maxattr, in genl_family_rcv_msg()
554 family->policy, in genl_family_rcv_msg()
561 if (!family->parallel_ops) { in genl_family_rcv_msg()
563 .module = family->module, in genl_family_rcv_msg()
577 .module = family->module, in genl_family_rcv_msg()
592 if (family->maxattr && family->parallel_ops) { in genl_family_rcv_msg()
593 attrbuf = kmalloc_array(family->maxattr + 1, in genl_family_rcv_msg()
599 attrbuf = family->attrbuf; in genl_family_rcv_msg()
607 err = __nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr, in genl_family_rcv_msg()
608 family->policy, validate, extack); in genl_family_rcv_msg()
623 if (family->pre_doit) { in genl_family_rcv_msg()
624 err = family->pre_doit(ops, skb, &info); in genl_family_rcv_msg()
631 if (family->post_doit) in genl_family_rcv_msg()
632 family->post_doit(ops, skb, &info); in genl_family_rcv_msg()
635 if (family->parallel_ops) in genl_family_rcv_msg()
644 const struct genl_family *family; in genl_rcv_msg() local
647 family = genl_family_find_byid(nlh->nlmsg_type); in genl_rcv_msg()
648 if (family == NULL) in genl_rcv_msg()
651 if (!family->parallel_ops) in genl_rcv_msg()
654 err = genl_family_rcv_msg(family, skb, nlh, extack); in genl_rcv_msg()
656 if (!family->parallel_ops) in genl_rcv_msg()
675 static int ctrl_fill_info(const struct genl_family *family, u32 portid, u32 seq, in ctrl_fill_info() argument
684 if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) || in ctrl_fill_info()
685 nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id) || in ctrl_fill_info()
686 nla_put_u32(skb, CTRL_ATTR_VERSION, family->version) || in ctrl_fill_info()
687 nla_put_u32(skb, CTRL_ATTR_HDRSIZE, family->hdrsize) || in ctrl_fill_info()
688 nla_put_u32(skb, CTRL_ATTR_MAXATTR, family->maxattr)) in ctrl_fill_info()
691 if (family->n_ops) { in ctrl_fill_info()
699 for (i = 0; i < family->n_ops; i++) { in ctrl_fill_info()
701 const struct genl_ops *ops = &family->ops[i]; in ctrl_fill_info()
708 if (family->policy) in ctrl_fill_info()
725 if (family->n_mcgrps) { in ctrl_fill_info()
733 for (i = 0; i < family->n_mcgrps; i++) { in ctrl_fill_info()
737 grp = &family->mcgrps[i]; in ctrl_fill_info()
744 family->mcgrp_offset + i) || in ctrl_fill_info()
762 static int ctrl_fill_mcgrp_info(const struct genl_family *family, in ctrl_fill_mcgrp_info() argument
775 if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) || in ctrl_fill_mcgrp_info()
776 nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id)) in ctrl_fill_mcgrp_info()
830 static struct sk_buff *ctrl_build_family_msg(const struct genl_family *family, in ctrl_build_family_msg() argument
840 err = ctrl_fill_info(family, portid, seq, 0, skb, cmd); in ctrl_build_family_msg()
850 ctrl_build_mcgrp_msg(const struct genl_family *family, in ctrl_build_mcgrp_msg() argument
861 err = ctrl_fill_mcgrp_info(family, grp, grp_id, portid, in ctrl_build_mcgrp_msg()
924 static int genl_ctrl_event(int event, const struct genl_family *family, in genl_ctrl_event() argument
938 msg = ctrl_build_family_msg(family, 0, 0, event); in genl_ctrl_event()
943 msg = ctrl_build_mcgrp_msg(family, grp, grp_id, 0, 0, event); in genl_ctrl_event()
952 if (!family->netnsok) { in genl_ctrl_event()
1052 struct nlattr **genl_family_attrbuf(const struct genl_family *family) in genl_family_attrbuf() argument
1054 if (!WARN_ON(family->parallel_ops)) in genl_family_attrbuf()
1057 return family->attrbuf; in genl_family_attrbuf()
1098 int genlmsg_multicast_allns(const struct genl_family *family, in genlmsg_multicast_allns() argument
1102 if (WARN_ON_ONCE(group >= family->n_mcgrps)) in genlmsg_multicast_allns()
1104 group = family->mcgrp_offset + group; in genlmsg_multicast_allns()
1109 void genl_notify(const struct genl_family *family, struct sk_buff *skb, in genl_notify() argument
1119 if (WARN_ON_ONCE(group >= family->n_mcgrps)) in genl_notify()
1121 group = family->mcgrp_offset + group; in genl_notify()