1/*
2 * netlink/msg.c		Netlink Messages Interface
3 *
4 *	This library is free software; you can redistribute it and/or
5 *	modify it under the terms of the GNU Lesser General Public
6 *	License as published by the Free Software Foundation version 2.1
7 *	of the License.
8 *
9 * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
10 */
11
12#ifndef NETLINK_MSG_H_
13#define NETLINK_MSG_H_
14
15#include <netlink/netlink.h>
16#include <netlink/object.h>
17#include <netlink/attr.h>
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23#define NL_DONTPAD	0
24
25/**
26 * @ingroup msg
27 * @brief
28 * Will cause the netlink pid to be set to the pid assigned to
29 * the netlink handle (socket) just before sending the message off.
30 * @note Requires the use of nl_send_auto_complete()!
31 */
32#define NL_AUTO_PID	0
33
34/**
35 * @ingroup msg
36 * @brief
37 * May be used to refer to a sequence number which should be
38 * automatically set just before sending the message off.
39 * @note Requires the use of nl_send_auto_complete()!
40 */
41#define NL_AUTO_SEQ	0
42
43struct nl_msg;
44struct nl_tree;
45struct ucred;
46
47/* size calculations */
48extern int		  nlmsg_msg_size(int);
49extern int		  nlmsg_total_size(int);
50extern int		  nlmsg_padlen(int);
51
52/* payload access */
53extern void *		  nlmsg_data(const struct nlmsghdr *);
54extern int		  nlmsg_len(const struct nlmsghdr *);
55extern void *		  nlmsg_tail(const struct nlmsghdr *);
56
57/* attribute access */
58extern struct nlattr *	  nlmsg_attrdata(const struct nlmsghdr *, int);
59extern int		  nlmsg_attrlen(const struct nlmsghdr *, int);
60
61/* message parsing */
62extern int		  nlmsg_valid_hdr(const struct nlmsghdr *, int);
63extern int		  nlmsg_ok(const struct nlmsghdr *, int);
64extern struct nlmsghdr *  nlmsg_next(struct nlmsghdr *, int *);
65extern int		  nlmsg_parse(struct nlmsghdr *, int, struct nlattr **,
66				      int, struct nla_policy *);
67extern struct nlattr *	  nlmsg_find_attr(struct nlmsghdr *, int, int);
68extern int		  nlmsg_validate(struct nlmsghdr *, int, int,
69					 struct nla_policy *);
70
71extern struct nl_msg *	  nlmsg_alloc(void);
72extern struct nl_msg *	  nlmsg_alloc_size(size_t);
73extern struct nl_msg *	  nlmsg_alloc_simple(int, int);
74extern void		  nlmsg_set_default_size(size_t);
75extern struct nl_msg *	  nlmsg_inherit(struct nlmsghdr *);
76extern struct nl_msg *	  nlmsg_convert(struct nlmsghdr *);
77extern void *		  nlmsg_reserve(struct nl_msg *, size_t, int);
78extern int		  nlmsg_append(struct nl_msg *, void *, size_t, int);
79extern int		  nlmsg_expand(struct nl_msg *, size_t);
80
81extern struct nlmsghdr *  nlmsg_put(struct nl_msg *, uint32_t, uint32_t,
82				    int, int, int);
83extern struct nlmsghdr *  nlmsg_hdr(struct nl_msg *);
84extern void		  nlmsg_get(struct nl_msg *);
85extern void		  nlmsg_free(struct nl_msg *);
86
87/* attribute modification */
88extern void		  nlmsg_set_proto(struct nl_msg *, int);
89extern int		  nlmsg_get_proto(struct nl_msg *);
90extern size_t		  nlmsg_get_max_size(struct nl_msg *);
91extern void		  nlmsg_set_src(struct nl_msg *, struct sockaddr_nl *);
92extern struct sockaddr_nl *nlmsg_get_src(struct nl_msg *);
93extern void		  nlmsg_set_dst(struct nl_msg *, struct sockaddr_nl *);
94extern struct sockaddr_nl *nlmsg_get_dst(struct nl_msg *);
95extern void		  nlmsg_set_creds(struct nl_msg *, struct ucred *);
96extern struct ucred *	  nlmsg_get_creds(struct nl_msg *);
97
98extern char *		  nl_nlmsgtype2str(int, char *, size_t);
99extern int		  nl_str2nlmsgtype(const char *);
100
101extern char *		  nl_nlmsg_flags2str(int, char *, size_t);
102
103extern int		  nl_msg_parse(struct nl_msg *,
104				       void (*cb)(struct nl_object *, void *),
105				       void *);
106
107extern void		nl_msg_dump(struct nl_msg *, FILE *);
108
109/**
110 * @name Iterators
111 * @{
112 */
113
114/**
115 * @ingroup msg
116 * Iterate over a stream of attributes in a message
117 * @arg pos	loop counter, set to current attribute
118 * @arg nlh	netlink message header
119 * @arg hdrlen	length of family header
120 * @arg rem	initialized to len, holds bytes currently remaining in stream
121 */
122#define nlmsg_for_each_attr(pos, nlh, hdrlen, rem) \
123	nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
124			  nlmsg_attrlen(nlh, hdrlen), rem)
125
126/**
127 * Iterate over a stream of messages
128 * @arg pos	loop counter, set to current message
129 * @arg head	head of message stream
130 * @arg len	length of message stream
131 * @arg rem	initialized to len, holds bytes currently remaining in stream
132 */
133#define nlmsg_for_each_msg(pos, head, len, rem) \
134	for (pos = head, rem = len; \
135	     nlmsg_ok(pos, rem); \
136	     pos = nlmsg_next(pos, &(rem)))
137
138/** @} */
139
140#ifdef __cplusplus
141}
142#endif
143
144#endif
145