/* SPDX-License-Identifier: LGPL-2.1-only */ /* * Copyright (c) 2014 Thomas Graf */ #ifndef __LIB_NL_CORE_H__ #define __LIB_NL_CORE_H__ struct nl_cb { nl_recvmsg_msg_cb_t cb_set[NL_CB_TYPE_MAX+1]; void * cb_args[NL_CB_TYPE_MAX+1]; nl_recvmsg_err_cb_t cb_err; void * cb_err_arg; /** May be used to replace nl_recvmsgs with your own implementation * in all internal calls to nl_recvmsgs. */ int (*cb_recvmsgs_ow)(struct nl_sock *, struct nl_cb *); /** Overwrite internal calls to nl_recv, must return the number of * octets read and allocate a buffer for the received data. */ int (*cb_recv_ow)(struct nl_sock *, struct sockaddr_nl *, unsigned char **, struct ucred **); /** Overwrites internal calls to nl_send, must send the netlink * message. */ int (*cb_send_ow)(struct nl_sock *, struct nl_msg *); int cb_refcnt; /** indicates the callback that is currently active */ enum nl_cb_type cb_active; }; static inline int nl_cb_call(struct nl_cb *cb, enum nl_cb_type type, struct nl_msg *msg) { int ret; cb->cb_active = type; ret = cb->cb_set[type](msg, cb->cb_args[type]); cb->cb_active = __NL_CB_TYPE_MAX; return ret; } int _nl_socket_is_local_port_unspecified (struct nl_sock *sk); uint32_t _nl_socket_set_local_port_no_release(struct nl_sock *sk, int generate_other); void _nl_socket_used_ports_release_all(const uint32_t *used_ports); void _nl_socket_used_ports_set(uint32_t *used_ports, uint32_t port); extern int nl_cache_parse(struct nl_cache_ops *, struct sockaddr_nl *, struct nlmsghdr *, struct nl_parser_param *); extern void dump_from_ops(struct nl_object *, struct nl_dump_params *); #endif /* __LIB_NL_CORE_H__ */