forked from Minki/linux
[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: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d387f6ad10
commit
97676b6b55
@ -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 @@
|
|||||||
* 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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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);
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user