X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetlink-socket.h;h=dd324090759af85d4852f6dacb0ef7698fe6e4bb;hb=cfc50ae514f805dcd9c14589f21158185424daf6;hp=c77050ee93f8a368d0e1152d4bc365e091c1919c;hpb=a88b4e04128310d0eb0c3d811782f8619bceb95c;p=sliver-openvswitch.git diff --git a/lib/netlink-socket.h b/lib/netlink-socket.h index c77050ee9..dd3240907 100644 --- a/lib/netlink-socket.h +++ b/lib/netlink-socket.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,12 +30,28 @@ * are Linux-specific. For Netlink protocol definitions, see * netlink-protocol.h. For helper functions for working with Netlink messages, * see netlink.h. + * + * + * Thread-safety + * ============= + * + * Most of the netlink functions are not fully thread-safe: Only a single + * thread may use a given nl_sock or nl_dump at one time. The exceptions are: + * + * - nl_sock_recv() is conditionally thread-safe: it may be called from + * different threads with the same nl_sock, but each caller must provide + * an independent receive buffer. + * + * - nl_dump_next() is conditionally thread-safe: it may be called from + * different threads with the same nl_dump, but each caller must provide + * independent buffers. */ #include #include #include #include "ofpbuf.h" +#include "ovs-atomic.h" struct nl_sock; @@ -90,22 +106,24 @@ int nl_transact(int protocol, const struct ofpbuf *request, void nl_transact_multiple(int protocol, struct nl_transaction **, size_t n); /* Table dumping. */ +#define NL_DUMP_BUFSIZE 4096 + struct nl_dump { struct nl_sock *sock; /* Socket being dumped. */ - uint32_t seq; /* Expected nlmsg_seq for replies. */ - struct ofpbuf buffer; /* Receive buffer currently being iterated. */ - int status; /* 0=OK, EOF=done, or positive errno value. */ + uint32_t nl_seq; /* Expected nlmsg_seq for replies. */ + atomic_uint status; /* Low bit set if we read final message. + * Other bits hold an errno (0 for success). */ + struct seq *status_seq; /* Tracks changes to the above 'status'. */ }; void nl_dump_start(struct nl_dump *, int protocol, const struct ofpbuf *request); -bool nl_dump_next(struct nl_dump *, struct ofpbuf *reply); +bool nl_dump_next(struct nl_dump *, struct ofpbuf *reply, struct ofpbuf *buf); int nl_dump_done(struct nl_dump *); /* Miscellaneous */ int nl_lookup_genl_family(const char *name, int *number); int nl_lookup_genl_mcgroup(const char *family_name, const char *group_name, - unsigned int *multicast_group, - unsigned int fallback); + unsigned int *multicast_group); #endif /* netlink-socket.h */