===== net/netlink/af_netlink.c 1.69 vs edited ===== --- 1.69/net/netlink/af_netlink.c 2005-01-21 21:25:32 +01:00 +++ edited/net/netlink/af_netlink.c 2005-02-15 03:34:53 +01:00 @@ -71,6 +71,7 @@ struct netlink_callback *cb; spinlock_t cb_lock; void (*data_ready)(struct sock *sk, int bytes); + int (*check_sender)(struct sk_buff *skb); }; #define nlk_sk(__sk) ((struct netlink_opt *)(__sk)->sk_protinfo) @@ -636,9 +637,15 @@ int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol) { struct netlink_opt *nlk; - int len = skb->len; + int err, len = skb->len; + nlk = nlk_sk(sk); + + if (nlk->check_sender) + if ((err = nlk->check_sender(skb))) { + netlink_detachskb(sk, skb); + return err; + } - nlk = nlk_sk(sk); #ifdef NL_EMULATE_DEV if (nlk->handler) { skb_orphan(skb); @@ -1063,6 +1070,12 @@ return sk; } +inline void netlink_kernel_set_check(struct sock *sk, + int (*check)(struct sk_buff *skb)) +{ + nlk_sk(sk)->check_sender = check; +} + void netlink_set_nonroot(int protocol, unsigned int flags) { if ((unsigned int)protocol < MAX_LINKS) @@ -1460,6 +1473,7 @@ EXPORT_SYMBOL(netlink_broadcast); EXPORT_SYMBOL(netlink_dump_start); EXPORT_SYMBOL(netlink_kernel_create); +EXPORT_SYMBOL(netlink_kernel_set_check); EXPORT_SYMBOL(netlink_register_notifier); EXPORT_SYMBOL(netlink_set_err); EXPORT_SYMBOL(netlink_set_nonroot); ===== include/linux/netlink.h 1.23 vs edited ===== --- 1.23/include/linux/netlink.h 2005-02-07 06:59:39 +01:00 +++ edited/include/linux/netlink.h 2005-02-15 02:53:35 +01:00 @@ -117,6 +117,7 @@ extern struct sock *netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len)); +extern inline void netlink_kernel_set_check(struct sock *sk, int (*check)(struct sk_buff *skb)); extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err); extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock); extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid,