Lines Matching refs:ys

76 ynl_err_walk(struct ynl_sock *ys, void *start, void *end, unsigned int off,  in ynl_err_walk()  argument
130 return n + ynl_err_walk(ys, start, end, off, policy->table[type].nest, in ynl_err_walk()
139 ynl_ext_ack_check(struct ynl_sock *ys, const struct nlmsghdr *nlh, in ynl_ext_ack_check() argument
143 char miss_attr[sizeof(ys->err.msg)]; in ynl_ext_ack_check()
144 char bad_attr[sizeof(ys->err.msg)]; in ynl_ext_ack_check()
186 ys->err.attr_offs = mnl_attr_get_u32(tb[NLMSGERR_ATTR_OFFS]); in ynl_ext_ack_check()
191 start = mnl_nlmsg_get_payload_offset(ys->nlh, in ynl_ext_ack_check()
193 end = mnl_nlmsg_get_payload_tail(ys->nlh); in ynl_ext_ack_check()
195 off = ys->err.attr_offs; in ynl_ext_ack_check()
199 n += ynl_err_walk(ys, start, end, off, ys->req_policy, in ynl_ext_ack_check()
217 start = mnl_nlmsg_get_payload_offset(ys->nlh, in ynl_ext_ack_check()
219 end = mnl_nlmsg_get_payload_tail(ys->nlh); in ynl_ext_ack_check()
221 nest_pol = ys->req_policy; in ynl_ext_ack_check()
227 n += ynl_err_walk(ys, start, end, off, ys->req_policy, in ynl_ext_ack_check()
244 yerr_msg(ys, "Kernel %s: '%s'%s%s%s", in ynl_ext_ack_check()
245 ys->err.code ? "error" : "warning", in ynl_ext_ack_check()
249 yerr_msg(ys, "Kernel %s: %s%s", in ynl_ext_ack_check()
250 ys->err.code ? "error" : "warning", in ynl_ext_ack_check()
264 yarg->ys->err.code = code; in ynl_cb_error()
271 ynl_ext_ack_check(yarg->ys, nlh, hlen); in ynl_cb_error()
283 yarg->ys->err.code = -err; in ynl_cb_done()
286 ynl_ext_ack_check(yarg->ys, nlh, sizeof(int)); in ynl_cb_done()
317 yerr(yarg->ys, YNL_ERROR_INTERNAL, in ynl_attr_validate()
326 yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, in ynl_attr_validate()
334 yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, in ynl_attr_validate()
340 yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, in ynl_attr_validate()
346 yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, in ynl_attr_validate()
352 yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, in ynl_attr_validate()
361 yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, in ynl_attr_validate()
367 yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, in ynl_attr_validate()
373 yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, in ynl_attr_validate()
377 yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, in ynl_attr_validate()
387 static void ynl_err_reset(struct ynl_sock *ys) in ynl_err_reset() argument
389 ys->err.code = 0; in ynl_err_reset()
390 ys->err.attr_offs = 0; in ynl_err_reset()
391 ys->err.msg[0] = 0; in ynl_err_reset()
394 struct nlmsghdr *ynl_msg_start(struct ynl_sock *ys, __u32 id, __u16 flags) in ynl_msg_start() argument
398 ynl_err_reset(ys); in ynl_msg_start()
400 nlh = ys->nlh = mnl_nlmsg_put_header(ys->tx_buf); in ynl_msg_start()
403 nlh->nlmsg_seq = ++ys->seq; in ynl_msg_start()
409 ynl_gemsg_start(struct ynl_sock *ys, __u32 id, __u16 flags, in ynl_gemsg_start() argument
416 nlh = ynl_msg_start(ys, id, flags); in ynl_gemsg_start()
428 void ynl_msg_start_req(struct ynl_sock *ys, __u32 id) in ynl_msg_start_req() argument
430 ynl_msg_start(ys, id, NLM_F_REQUEST | NLM_F_ACK); in ynl_msg_start_req()
433 void ynl_msg_start_dump(struct ynl_sock *ys, __u32 id) in ynl_msg_start_dump() argument
435 ynl_msg_start(ys, id, NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP); in ynl_msg_start_dump()
439 ynl_gemsg_start_req(struct ynl_sock *ys, __u32 id, __u8 cmd, __u8 version) in ynl_gemsg_start_req() argument
441 return ynl_gemsg_start(ys, id, NLM_F_REQUEST | NLM_F_ACK, cmd, version); in ynl_gemsg_start_req()
445 ynl_gemsg_start_dump(struct ynl_sock *ys, __u32 id, __u8 cmd, __u8 version) in ynl_gemsg_start_dump() argument
447 return ynl_gemsg_start(ys, id, NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP, in ynl_gemsg_start_dump()
451 int ynl_recv_ack(struct ynl_sock *ys, int ret) in ynl_recv_ack() argument
454 yerr(ys, YNL_ERROR_EXPECT_ACK, in ynl_recv_ack()
459 ret = mnl_socket_recvfrom(ys->sock, ys->rx_buf, MNL_SOCKET_BUFFER_SIZE); in ynl_recv_ack()
461 perr(ys, "Socket receive failed"); in ynl_recv_ack()
464 return mnl_cb_run(ys->rx_buf, ret, ys->seq, ys->portid, in ynl_recv_ack()
465 ynl_cb_null, ys); in ynl_recv_ack()
472 yerr(yarg->ys, YNL_ERROR_UNEXPECT_MSG, in ynl_cb_null()
480 ynl_get_family_info_mcast(struct ynl_sock *ys, const struct nlattr *mcasts) in ynl_get_family_info_mcast() argument
486 ys->n_mcast_groups++; in ynl_get_family_info_mcast()
488 if (!ys->n_mcast_groups) in ynl_get_family_info_mcast()
491 ys->mcast_groups = calloc(ys->n_mcast_groups, in ynl_get_family_info_mcast()
492 sizeof(*ys->mcast_groups)); in ynl_get_family_info_mcast()
493 if (!ys->mcast_groups) in ynl_get_family_info_mcast()
500 ys->mcast_groups[i].id = mnl_attr_get_u32(attr); in ynl_get_family_info_mcast()
502 strncpy(ys->mcast_groups[i].name, in ynl_get_family_info_mcast()
505 ys->mcast_groups[i].name[GENL_NAMSIZ - 1] = 0; in ynl_get_family_info_mcast()
516 struct ynl_sock *ys = yarg->ys; in ynl_get_family_info_cb() local
522 if (ynl_get_family_info_mcast(ys, attr)) in ynl_get_family_info_cb()
529 yerr(ys, YNL_ERROR_ATTR_INVALID, "Invalid family ID"); in ynl_get_family_info_cb()
533 ys->family_id = mnl_attr_get_u16(attr); in ynl_get_family_info_cb()
538 yerr(ys, YNL_ERROR_ATTR_MISSING, "Family ID missing"); in ynl_get_family_info_cb()
544 static int ynl_sock_read_family(struct ynl_sock *ys, const char *family_name) in ynl_sock_read_family() argument
546 struct ynl_parse_arg yarg = { .ys = ys, }; in ynl_sock_read_family()
550 nlh = ynl_gemsg_start_req(ys, GENL_ID_CTRL, CTRL_CMD_GETFAMILY, 1); in ynl_sock_read_family()
553 err = mnl_socket_sendto(ys->sock, nlh, nlh->nlmsg_len); in ynl_sock_read_family()
555 perr(ys, "failed to request socket family info"); in ynl_sock_read_family()
559 err = mnl_socket_recvfrom(ys->sock, ys->rx_buf, MNL_SOCKET_BUFFER_SIZE); in ynl_sock_read_family()
561 perr(ys, "failed to receive the socket family info"); in ynl_sock_read_family()
564 err = mnl_cb_run2(ys->rx_buf, err, ys->seq, ys->portid, in ynl_sock_read_family()
568 free(ys->mcast_groups); in ynl_sock_read_family()
569 perr(ys, "failed to receive the socket family info - no such family?"); in ynl_sock_read_family()
573 return ynl_recv_ack(ys, err); in ynl_sock_read_family()
579 struct ynl_sock *ys; in ynl_sock_create() local
582 ys = malloc(sizeof(*ys) + 2 * MNL_SOCKET_BUFFER_SIZE); in ynl_sock_create()
583 if (!ys) in ynl_sock_create()
585 memset(ys, 0, sizeof(*ys)); in ynl_sock_create()
587 ys->family = yf; in ynl_sock_create()
588 ys->tx_buf = &ys->raw_buf[0]; in ynl_sock_create()
589 ys->rx_buf = &ys->raw_buf[MNL_SOCKET_BUFFER_SIZE]; in ynl_sock_create()
590 ys->ntf_last_next = &ys->ntf_first; in ynl_sock_create()
592 ys->sock = mnl_socket_open(NETLINK_GENERIC); in ynl_sock_create()
593 if (!ys->sock) { in ynl_sock_create()
598 if (mnl_socket_setsockopt(ys->sock, NETLINK_CAP_ACK, in ynl_sock_create()
603 if (mnl_socket_setsockopt(ys->sock, NETLINK_EXT_ACK, in ynl_sock_create()
609 ys->seq = random(); in ynl_sock_create()
610 ys->portid = mnl_socket_get_portid(ys->sock); in ynl_sock_create()
612 if (ynl_sock_read_family(ys, yf->name)) { in ynl_sock_create()
614 memcpy(yse, &ys->err, sizeof(*yse)); in ynl_sock_create()
618 return ys; in ynl_sock_create()
621 mnl_socket_close(ys->sock); in ynl_sock_create()
623 free(ys); in ynl_sock_create()
627 void ynl_sock_destroy(struct ynl_sock *ys) in ynl_sock_destroy() argument
631 mnl_socket_close(ys->sock); in ynl_sock_destroy()
632 while ((ntf = ynl_ntf_dequeue(ys))) in ynl_sock_destroy()
634 free(ys->mcast_groups); in ynl_sock_destroy()
635 free(ys); in ynl_sock_destroy()
645 int ynl_subscribe(struct ynl_sock *ys, const char *grp_name) in ynl_subscribe() argument
650 for (i = 0; i < ys->n_mcast_groups; i++) in ynl_subscribe()
651 if (!strcmp(ys->mcast_groups[i].name, grp_name)) in ynl_subscribe()
653 if (i == ys->n_mcast_groups) { in ynl_subscribe()
654 yerr(ys, ENOENT, "Multicast group '%s' not found", grp_name); in ynl_subscribe()
658 err = mnl_socket_setsockopt(ys->sock, NETLINK_ADD_MEMBERSHIP, in ynl_subscribe()
659 &ys->mcast_groups[i].id, in ynl_subscribe()
660 sizeof(ys->mcast_groups[i].id)); in ynl_subscribe()
662 perr(ys, "Subscribing to multicast group failed"); in ynl_subscribe()
669 int ynl_socket_get_fd(struct ynl_sock *ys) in ynl_socket_get_fd() argument
671 return mnl_socket_get_fd(ys->sock); in ynl_socket_get_fd()
674 struct ynl_ntf_base_type *ynl_ntf_dequeue(struct ynl_sock *ys) in ynl_ntf_dequeue() argument
678 if (!ynl_has_ntf(ys)) in ynl_ntf_dequeue()
681 ntf = ys->ntf_first; in ynl_ntf_dequeue()
682 ys->ntf_first = ntf->next; in ynl_ntf_dequeue()
683 if (ys->ntf_last_next == &ntf->next) in ynl_ntf_dequeue()
684 ys->ntf_last_next = &ys->ntf_first; in ynl_ntf_dequeue()
689 static int ynl_ntf_parse(struct ynl_sock *ys, const struct nlmsghdr *nlh) in ynl_ntf_parse() argument
691 struct ynl_parse_arg yarg = { .ys = ys, }; in ynl_ntf_parse()
698 if (gehdr->cmd >= ys->family->ntf_info_size) in ynl_ntf_parse()
700 info = &ys->family->ntf_info[gehdr->cmd]; in ynl_ntf_parse()
716 *ys->ntf_last_next = rsp; in ynl_ntf_parse()
717 ys->ntf_last_next = &rsp->next; in ynl_ntf_parse()
731 int ynl_ntf_check(struct ynl_sock *ys) in ynl_ntf_check() argument
742 pfd.fd = mnl_socket_get_fd(ys->sock); in ynl_ntf_check()
748 len = mnl_socket_recvfrom(ys->sock, ys->rx_buf, in ynl_ntf_check()
753 err = mnl_cb_run2(ys->rx_buf, len, ys->seq, ys->portid, in ynl_ntf_check()
754 ynl_ntf_trampoline, ys, in ynl_ntf_check()
767 void ynl_error_unknown_notification(struct ynl_sock *ys, __u8 cmd) in ynl_error_unknown_notification() argument
769 yerr(ys, YNL_ERROR_UNKNOWN_NTF, in ynl_error_unknown_notification()
775 yerr(yarg->ys, YNL_ERROR_INV_RESP, "Error parsing response: %s", msg); in ynl_error_parse()
780 ynl_check_alien(struct ynl_sock *ys, const struct nlmsghdr *nlh, __u32 rsp_cmd) in ynl_check_alien() argument
785 yerr(ys, YNL_ERROR_INV_RESP, in ynl_check_alien()
792 return ynl_ntf_parse(ys, nlh); in ynl_check_alien()
802 ret = ynl_check_alien(yrs->yarg.ys, nlh, yrs->rsp_cmd); in ynl_req_trampoline()
809 int ynl_exec(struct ynl_sock *ys, struct nlmsghdr *req_nlh, in ynl_exec() argument
815 err = mnl_socket_sendto(ys->sock, req_nlh, req_nlh->nlmsg_len); in ynl_exec()
820 len = mnl_socket_recvfrom(ys->sock, ys->rx_buf, in ynl_exec()
825 err = mnl_cb_run2(ys->rx_buf, len, ys->seq, ys->portid, in ynl_exec()
842 ret = ynl_check_alien(ds->ys, nlh, ds->rsp_cmd); in ynl_dump_trampoline()
856 yarg.ys = ds->ys; in ynl_dump_trampoline()
872 int ynl_exec_dump(struct ynl_sock *ys, struct nlmsghdr *req_nlh, in ynl_exec_dump() argument
878 err = mnl_socket_sendto(ys->sock, req_nlh, req_nlh->nlmsg_len); in ynl_exec_dump()
883 len = mnl_socket_recvfrom(ys->sock, ys->rx_buf, in ynl_exec_dump()
888 err = mnl_cb_run2(ys->rx_buf, len, ys->seq, ys->portid, in ynl_exec_dump()