diff options
author | Johannes Berg <johannes.berg@intel.com> | 2011-06-20 07:40:46 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-06-22 16:09:45 -0400 |
commit | 670dc2833d144375eac36ad74111495a825a9288 (patch) | |
tree | 12d5d3a925da562a6ba0497c47f4b55c71ff545b /include/linux/netlink.h | |
parent | c1c3daee97498f5d74bfd23531cfe23c8e14a619 (diff) |
netlink: advertise incomplete dumps
Consider the following situation:
* a dump that would show 8 entries, four in the first
round, and four in the second
* between the first and second rounds, 6 entries are
removed
* now the second round will not show any entry, and
even if there is a sequence/generation counter the
application will not know
To solve this problem, add a new flag NLM_F_DUMP_INTR
to the netlink header that indicates the dump wasn't
consistent, this flag can also be set on the MSG_DONE
message that terminates the dump, and as such above
situation can be detected.
To achieve this, add a sequence counter to the netlink
callback struct. Of course, netlink code still needs
to use this new functionality. The correct way to do
that is to always set cb->seq when a dumpit callback
is invoked and call nl_dump_check_consistent() for
each new message. The core code will also call this
function for the final MSG_DONE message.
To make it usable with generic netlink, a new function
genlmsg_nlhdr() is needed to obtain the netlink header
from the genetlink user header.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'include/linux/netlink.h')
-rw-r--r-- | include/linux/netlink.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 4c4ac3f3ce5a..8d1bcec5cc06 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
@@ -48,6 +48,7 @@ struct nlmsghdr { | |||
48 | #define NLM_F_MULTI 2 /* Multipart message, terminated by NLMSG_DONE */ | 48 | #define NLM_F_MULTI 2 /* Multipart message, terminated by NLMSG_DONE */ |
49 | #define NLM_F_ACK 4 /* Reply with ack, with zero or error code */ | 49 | #define NLM_F_ACK 4 /* Reply with ack, with zero or error code */ |
50 | #define NLM_F_ECHO 8 /* Echo this request */ | 50 | #define NLM_F_ECHO 8 /* Echo this request */ |
51 | #define NLM_F_DUMP_INTR 16 /* Dump was inconsistent due to sequence change */ | ||
51 | 52 | ||
52 | /* Modifiers to GET request */ | 53 | /* Modifiers to GET request */ |
53 | #define NLM_F_ROOT 0x100 /* specify tree root */ | 54 | #define NLM_F_ROOT 0x100 /* specify tree root */ |
@@ -221,6 +222,7 @@ struct netlink_callback { | |||
221 | struct netlink_callback *cb); | 222 | struct netlink_callback *cb); |
222 | int (*done)(struct netlink_callback *cb); | 223 | int (*done)(struct netlink_callback *cb); |
223 | int family; | 224 | int family; |
225 | unsigned int prev_seq, seq; | ||
224 | long args[6]; | 226 | long args[6]; |
225 | }; | 227 | }; |
226 | 228 | ||