Home | History | Annotate | Download | only in netlink
      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 (at) 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
     20 extern "C" {
     21 #endif
     22 
     23 #define NL_DONTPAD	0
     24 
     25 /**
     26  * @ingroup msg
     27  * @brief
     28  * Will cause the netlink port to be set to the port assigned to
     29  * the netlink icoket ust before sending the message off.
     30  *
     31  * @note Requires the use of nl_send_auto()!
     32  */
     33 #define NL_AUTO_PORT	0
     34 #define NL_AUTO_PID	NL_AUTO_PORT
     35 
     36 /**
     37  * @ingroup msg
     38  * @brief
     39  * May be used to refer to a sequence number which should be
     40  * automatically set just before sending the message off.
     41  *
     42  * @note Requires the use of nl_send_auto()!
     43  */
     44 #define NL_AUTO_SEQ	0
     45 
     46 struct nl_msg;
     47 struct nl_tree;
     48 struct ucred;
     49 
     50 extern int			nlmsg_size(int);
     51 extern int			nlmsg_total_size(int);
     52 extern int			nlmsg_padlen(int);
     53 
     54 extern void *			nlmsg_data(const struct nlmsghdr *);
     55 extern int			nlmsg_datalen(const struct nlmsghdr *);
     56 extern void *			nlmsg_tail(const struct nlmsghdr *);
     57 
     58 /* attribute access */
     59 extern struct nlattr *	  nlmsg_attrdata(const struct nlmsghdr *, int);
     60 extern int		  nlmsg_attrlen(const struct nlmsghdr *, int);
     61 
     62 /* message parsing */
     63 extern int		  nlmsg_valid_hdr(const struct nlmsghdr *, int);
     64 extern int		  nlmsg_ok(const struct nlmsghdr *, int);
     65 extern struct nlmsghdr *  nlmsg_next(struct nlmsghdr *, int *);
     66 extern int		  nlmsg_parse(struct nlmsghdr *, int, struct nlattr **,
     67 				      int, struct nla_policy *);
     68 extern struct nlattr *	  nlmsg_find_attr(struct nlmsghdr *, int, int);
     69 extern int		  nlmsg_validate(struct nlmsghdr *, int, int,
     70 					 struct nla_policy *);
     71 
     72 extern struct nl_msg *	  nlmsg_alloc(void);
     73 extern struct nl_msg *	  nlmsg_alloc_size(size_t);
     74 extern struct nl_msg *	  nlmsg_alloc_simple(int, int);
     75 extern void		  nlmsg_set_default_size(size_t);
     76 extern struct nl_msg *	  nlmsg_inherit(struct nlmsghdr *);
     77 extern struct nl_msg *	  nlmsg_convert(struct nlmsghdr *);
     78 extern void *		  nlmsg_reserve(struct nl_msg *, size_t, int);
     79 extern int		  nlmsg_append(struct nl_msg *, void *, size_t, int);
     80 extern int		  nlmsg_expand(struct nl_msg *, size_t);
     81 
     82 extern struct nlmsghdr *  nlmsg_put(struct nl_msg *, uint32_t, uint32_t,
     83 				    int, int, int);
     84 extern struct nlmsghdr *  nlmsg_hdr(struct nl_msg *);
     85 extern void		  nlmsg_get(struct nl_msg *);
     86 extern void		  nlmsg_free(struct nl_msg *);
     87 
     88 /* attribute modification */
     89 extern void		  nlmsg_set_proto(struct nl_msg *, int);
     90 extern int		  nlmsg_get_proto(struct nl_msg *);
     91 extern size_t		  nlmsg_get_max_size(struct nl_msg *);
     92 extern void		  nlmsg_set_src(struct nl_msg *, struct sockaddr_nl *);
     93 extern struct sockaddr_nl *nlmsg_get_src(struct nl_msg *);
     94 extern void		  nlmsg_set_dst(struct nl_msg *, struct sockaddr_nl *);
     95 extern struct sockaddr_nl *nlmsg_get_dst(struct nl_msg *);
     96 extern void		  nlmsg_set_creds(struct nl_msg *, struct ucred *);
     97 extern struct ucred *	  nlmsg_get_creds(struct nl_msg *);
     98 
     99 extern char *		  nl_nlmsgtype2str(int, char *, size_t);
    100 extern int		  nl_str2nlmsgtype(const char *);
    101 
    102 extern char *		  nl_nlmsg_flags2str(int, char *, size_t);
    103 
    104 extern int		  nl_msg_parse(struct nl_msg *,
    105 				       void (*cb)(struct nl_object *, void *),
    106 				       void *);
    107 
    108 extern void		nl_msg_dump(struct nl_msg *, FILE *);
    109 
    110 /**
    111  * @name Iterators
    112  * @{
    113  */
    114 
    115 /**
    116  * @ingroup msg
    117  * Iterate over a stream of attributes in a message
    118  * @arg pos	loop counter, set to current attribute
    119  * @arg nlh	netlink message header
    120  * @arg hdrlen	length of family header
    121  * @arg rem	initialized to len, holds bytes currently remaining in stream
    122  */
    123 #define nlmsg_for_each_attr(pos, nlh, hdrlen, rem) \
    124 	nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
    125 			  nlmsg_attrlen(nlh, hdrlen), rem)
    126 
    127 /**
    128  * Iterate over a stream of messages
    129  * @arg pos	loop counter, set to current message
    130  * @arg head	head of message stream
    131  * @arg len	length of message stream
    132  */
    133 #define nlmsg_for_each(pos, head, len) \
    134 	for (int rem = len, pos = head; \
    135 		nlmsg_ok(pos, rem); \
    136 		pos = nlmsg_next(pos, &rem))
    137 
    138 #define nlmsg_for_each_msg(pos, head, len, rem) \
    139 		nlmsg_for_each(pos, head, len)
    140 
    141 /** @} */
    142 
    143 #ifdef __cplusplus
    144 }
    145 #endif
    146 
    147 #endif
    148