diff options
| author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-04-30 13:57:29 +0000 | 
|---|---|---|
| committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-04-30 13:57:29 +0000 | 
| commit | e8d08775f6f9dc8496ee6eea3cf91f06c5991c98 (patch) | |
| tree | a15d257ea63d5208cf9c790366af0d3d3eed4eec /package/libnl-tiny/src/include/netlink/socket.h | |
| parent | 887ce09dca0c9790ec5655638fc57e8bcddfeb34 (diff) | |
add libnl-tiny as a small replacement for libnl with only genl support included
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@15507 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/libnl-tiny/src/include/netlink/socket.h')
| -rw-r--r-- | package/libnl-tiny/src/include/netlink/socket.h | 221 | 
1 files changed, 221 insertions, 0 deletions
| diff --git a/package/libnl-tiny/src/include/netlink/socket.h b/package/libnl-tiny/src/include/netlink/socket.h new file mode 100644 index 000000000..9f7f4220a --- /dev/null +++ b/package/libnl-tiny/src/include/netlink/socket.h @@ -0,0 +1,221 @@ +/* + * netlink/socket.h		Netlink Socket + * + *	This library is free software; you can redistribute it and/or + *	modify it under the terms of the GNU Lesser General Public + *	License as published by the Free Software Foundation version 2.1 + *	of the License. + * + * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch> + */ + +#ifndef NETLINK_SOCKET_H_ +#define NETLINK_SOCKET_H_ + +#include <netlink/types.h> +#include <netlink/handlers.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define NL_SOCK_BUFSIZE_SET	(1<<0) +#define NL_SOCK_PASSCRED	(1<<1) +#define NL_OWN_PORT		(1<<2) +#define NL_MSG_PEEK		(1<<3) +#define NL_NO_AUTO_ACK		(1<<4) + +struct nl_cb; +struct nl_sock +{ +	struct sockaddr_nl	s_local; +	struct sockaddr_nl	s_peer; +	int			s_fd; +	int			s_proto; +	unsigned int		s_seq_next; +	unsigned int		s_seq_expect; +	int			s_flags; +	struct nl_cb *		s_cb; +}; + + +extern struct nl_sock *	nl_socket_alloc(void); +extern struct nl_sock *	nl_socket_alloc_cb(struct nl_cb *); +extern void		nl_socket_free(struct nl_sock *); + +extern void		nl_socket_set_local_port(struct nl_sock *, uint32_t); + +extern int		nl_socket_add_memberships(struct nl_sock *, int, ...); +extern int		nl_socket_drop_memberships(struct nl_sock *, int, ...); + +extern int		nl_socket_set_buffer_size(struct nl_sock *, int, int); +extern int		nl_socket_set_passcred(struct nl_sock *, int); +extern int		nl_socket_recv_pktinfo(struct nl_sock *, int); + +extern void		nl_socket_disable_seq_check(struct nl_sock *); + +extern int		nl_socket_set_nonblocking(struct nl_sock *); + +/** + * Use next sequence number + * @arg sk		Netlink socket. + * + * Uses the next available sequence number and increases the counter + * by one for subsequent calls. + * + * @return Unique serial sequence number + */ +static inline unsigned int nl_socket_use_seq(struct nl_sock *sk) +{ +	return sk->s_seq_next++; +} + +/** + * Disable automatic request for ACK + * @arg sk		Netlink socket. + * + * The default behaviour of a socket is to request an ACK for + * each message sent to allow for the caller to synchronize to + * the completion of the netlink operation. This function + * disables this behaviour and will result in requests being + * sent which will not have the NLM_F_ACK flag set automatically. + * However, it is still possible for the caller to set the + * NLM_F_ACK flag explicitely. + */ +static inline void nl_socket_disable_auto_ack(struct nl_sock *sk) +{ +	sk->s_flags |= NL_NO_AUTO_ACK; +} + +/** + * Enable automatic request for ACK (default) + * @arg sk		Netlink socket. + * @see nl_socket_disable_auto_ack + */ +static inline void nl_socket_enable_auto_ack(struct nl_sock *sk) +{ +	sk->s_flags &= ~NL_NO_AUTO_ACK; +} + +/** + * @name Source Idenficiation + * @{ + */ + +static inline uint32_t nl_socket_get_local_port(struct nl_sock *sk) +{ +	return sk->s_local.nl_pid; +} + +/** + * Join multicast groups (deprecated) + * @arg sk		Netlink socket. + * @arg groups		Bitmask of groups to join. + * + * This function defines the old way of joining multicast group which + * has to be done prior to calling nl_connect(). It works on any kernel + * version but is very limited as only 32 groups can be joined. + */ +static inline void nl_join_groups(struct nl_sock *sk, int groups) +{ +	sk->s_local.nl_groups |= groups; +} + +/** + * @name Peer Identfication + * @{ + */ + +static inline uint32_t nl_socket_get_peer_port(struct nl_sock *sk) +{ +	return sk->s_peer.nl_pid; +} + +static inline void nl_socket_set_peer_port(struct nl_sock *sk, uint32_t port) +{ +	sk->s_peer.nl_pid = port; +} + +/** @} */ + +/** + * @name File Descriptor + * @{ + */ + +static inline int nl_socket_get_fd(struct nl_sock *sk) +{ +	return sk->s_fd; +} + +/** + * Enable use of MSG_PEEK when reading from socket + * @arg sk		Netlink socket. + */ +static inline void nl_socket_enable_msg_peek(struct nl_sock *sk) +{ +	sk->s_flags |= NL_MSG_PEEK; +} + +/** + * Disable use of MSG_PEEK when reading from socket + * @arg sk		Netlink socket. + */ +static inline void nl_socket_disable_msg_peek(struct nl_sock *sk) +{ +	sk->s_flags &= ~NL_MSG_PEEK; +} + +/** + * @name Callback Handler + * @{ + */ + +static inline struct nl_cb *nl_socket_get_cb(struct nl_sock *sk) +{ +	return nl_cb_get(sk->s_cb); +} + +static inline void nl_socket_set_cb(struct nl_sock *sk, struct nl_cb *cb) +{ +	nl_cb_put(sk->s_cb); +	sk->s_cb = nl_cb_get(cb); +} + +/** + * Modify the callback handler associated to the socket + * @arg sk		Netlink socket. + * @arg type		which type callback to set + * @arg kind		kind of callback + * @arg func		callback function + * @arg arg		argument to be passwd to callback function + * + * @see nl_cb_set + */ +static inline int nl_socket_modify_cb(struct nl_sock *sk, enum nl_cb_type type, +			enum nl_cb_kind kind, nl_recvmsg_msg_cb_t func, +			void *arg) +{ +	return nl_cb_set(sk->s_cb, type, kind, func, arg); +} + +/** @} */ + +static inline int nl_socket_add_membership(struct nl_sock *sk, int group) +{ +	return nl_socket_add_memberships(sk, group, 0); +} + + +static inline int nl_socket_drop_membership(struct nl_sock *sk, int group) +{ +	return nl_socket_drop_memberships(sk, group, 0); +} + + + +#ifdef __cplusplus +} +#endif + +#endif | 
