Commit 97676b6b authored by Thomas Graf's avatar Thomas Graf Committed by David S. Miller

[RTNETLINK]: Add rtnetlink notification interface

Adds rtnl_notify() to send rtnetlink notification messages and
rtnl_set_sk_err() to report notification errors as socket
errors in order to indicate the need of a resync due to loss
of events.

nlmsg_report() is added to properly document the meaning of
NLM_F_ECHO.
Signed-off-by: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d387f6ad
...@@ -585,6 +585,9 @@ struct rtnetlink_link ...@@ -585,6 +585,9 @@ struct rtnetlink_link
extern struct rtnetlink_link * rtnetlink_links[NPROTO]; extern struct rtnetlink_link * rtnetlink_links[NPROTO];
extern int rtnetlink_send(struct sk_buff *skb, u32 pid, u32 group, int echo); extern int rtnetlink_send(struct sk_buff *skb, u32 pid, u32 group, int echo);
extern int rtnl_unicast(struct sk_buff *skb, u32 pid); extern int rtnl_unicast(struct sk_buff *skb, u32 pid);
extern int rtnl_notify(struct sk_buff *skb, u32 pid, u32 group,
struct nlmsghdr *nlh, gfp_t flags);
extern void rtnl_set_sk_err(u32 group, int error);
extern int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics); extern int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics);
extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data); extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data);
......
...@@ -65,6 +65,9 @@ ...@@ -65,6 +65,9 @@
* nlmsg_validate() validate netlink message incl. attrs * nlmsg_validate() validate netlink message incl. attrs
* nlmsg_for_each_attr() loop over all attributes * nlmsg_for_each_attr() loop over all attributes
* *
* Misc:
* nlmsg_report() report back to application?
*
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Attributes Interface * Attributes Interface
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
...@@ -194,6 +197,9 @@ extern void netlink_run_queue(struct sock *sk, unsigned int *qlen, ...@@ -194,6 +197,9 @@ extern void netlink_run_queue(struct sock *sk, unsigned int *qlen,
struct nlmsghdr *, int *)); struct nlmsghdr *, int *));
extern void netlink_queue_skip(struct nlmsghdr *nlh, extern void netlink_queue_skip(struct nlmsghdr *nlh,
struct sk_buff *skb); struct sk_buff *skb);
extern int nlmsg_notify(struct sock *sk, struct sk_buff *skb,
u32 pid, unsigned int group, int report,
gfp_t flags);
extern int nla_validate(struct nlattr *head, int len, int maxtype, extern int nla_validate(struct nlattr *head, int len, int maxtype,
struct nla_policy *policy); struct nla_policy *policy);
...@@ -375,6 +381,17 @@ static inline int nlmsg_validate(struct nlmsghdr *nlh, int hdrlen, int maxtype, ...@@ -375,6 +381,17 @@ static inline int nlmsg_validate(struct nlmsghdr *nlh, int hdrlen, int maxtype,
nlmsg_attrlen(nlh, hdrlen), maxtype, policy); nlmsg_attrlen(nlh, hdrlen), maxtype, policy);
} }
/**
* nlmsg_report - need to report back to application?
* @nlh: netlink message header
*
* Returns 1 if a report back to the application is requested.
*/
static inline int nlmsg_report(struct nlmsghdr *nlh)
{
return !!(nlh->nlmsg_flags & NLM_F_ECHO);
}
/** /**
* nlmsg_for_each_attr - iterate over a stream of attributes * nlmsg_for_each_attr - iterate over a stream of attributes
* @pos: loop counter, set to current attribute * @pos: loop counter, set to current attribute
......
...@@ -171,6 +171,22 @@ int rtnl_unicast(struct sk_buff *skb, u32 pid) ...@@ -171,6 +171,22 @@ int rtnl_unicast(struct sk_buff *skb, u32 pid)
return nlmsg_unicast(rtnl, skb, pid); return nlmsg_unicast(rtnl, skb, pid);
} }
int rtnl_notify(struct sk_buff *skb, u32 pid, u32 group,
struct nlmsghdr *nlh, gfp_t flags)
{
int report = 0;
if (nlh)
report = nlmsg_report(nlh);
return nlmsg_notify(rtnl, skb, pid, group, report, flags);
}
void rtnl_set_sk_err(u32 group, int error)
{
netlink_set_err(rtnl, 0, group, error);
}
int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics) int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics)
{ {
struct rtattr *mx = (struct rtattr*)skb->tail; struct rtattr *mx = (struct rtattr*)skb->tail;
...@@ -829,3 +845,5 @@ EXPORT_SYMBOL(rtnl_lock); ...@@ -829,3 +845,5 @@ EXPORT_SYMBOL(rtnl_lock);
EXPORT_SYMBOL(rtnl_trylock); EXPORT_SYMBOL(rtnl_trylock);
EXPORT_SYMBOL(rtnl_unlock); EXPORT_SYMBOL(rtnl_unlock);
EXPORT_SYMBOL(rtnl_unicast); EXPORT_SYMBOL(rtnl_unicast);
EXPORT_SYMBOL(rtnl_notify);
EXPORT_SYMBOL(rtnl_set_sk_err);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment