diff options
author | Thomas Graf <tgraf@suug.ch> | 2007-03-23 02:28:46 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-04-26 01:27:29 -0400 |
commit | d35b685640aeb39eb4f5e98c75e8e001e406f9a3 (patch) | |
tree | c3ec38a2fb54a3783dd9c764bf58be68557f9396 /net/netlink/af_netlink.c | |
parent | 33a0543cd9e090d2c6759e0ed85c3049c6efcc06 (diff) |
[NETLINK]: Ignore !NLM_F_REQUEST messages directly in netlink_run_queue()
netlink_rcv_skb() is changed to skip messages which don't have the
NLM_F_REQUEST bit to avoid every netlink family having to perform this
check on their own.
Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/netlink/af_netlink.c')
-rw-r--r-- | net/netlink/af_netlink.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 8488c15f2643..7b455980e9bf 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -1470,10 +1470,15 @@ static int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *, | |||
1470 | 1470 | ||
1471 | while (skb->len >= nlmsg_total_size(0)) { | 1471 | while (skb->len >= nlmsg_total_size(0)) { |
1472 | nlh = nlmsg_hdr(skb); | 1472 | nlh = nlmsg_hdr(skb); |
1473 | err = 0; | ||
1473 | 1474 | ||
1474 | if (nlh->nlmsg_len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len) | 1475 | if (nlh->nlmsg_len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len) |
1475 | return 0; | 1476 | return 0; |
1476 | 1477 | ||
1478 | /* Only requests are handled by the kernel */ | ||
1479 | if (!(nlh->nlmsg_flags & NLM_F_REQUEST)) | ||
1480 | goto skip; | ||
1481 | |||
1477 | if (cb(skb, nlh, &err) < 0) { | 1482 | if (cb(skb, nlh, &err) < 0) { |
1478 | /* Not an error, but we have to interrupt processing | 1483 | /* Not an error, but we have to interrupt processing |
1479 | * here. Note: that in this case we do not pull | 1484 | * here. Note: that in this case we do not pull |
@@ -1481,9 +1486,10 @@ static int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *, | |||
1481 | */ | 1486 | */ |
1482 | if (err == 0) | 1487 | if (err == 0) |
1483 | return -1; | 1488 | return -1; |
1489 | } | ||
1490 | skip: | ||
1491 | if (nlh->nlmsg_flags & NLM_F_ACK || err) | ||
1484 | netlink_ack(skb, nlh, err); | 1492 | netlink_ack(skb, nlh, err); |
1485 | } else if (nlh->nlmsg_flags & NLM_F_ACK) | ||
1486 | netlink_ack(skb, nlh, 0); | ||
1487 | 1493 | ||
1488 | netlink_queue_skip(nlh, skb); | 1494 | netlink_queue_skip(nlh, skb); |
1489 | } | 1495 | } |