X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetlink.c;h=c8e5905abc59c5b0746441ac597e77a81989648f;hb=add037c6b692db9c66dd0c16dff2d4b1b46c7499;hp=64450497cee3332ed410b281e154ffd909f40cc7;hpb=be3330a669e3461c2269331566aad76dc93cd0ed;p=sliver-openvswitch.git diff --git a/lib/netlink.c b/lib/netlink.c index 64450497c..c8e5905ab 100644 --- a/lib/netlink.c +++ b/lib/netlink.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ #include #include "netlink.h" -#include #include #include #include @@ -88,26 +87,6 @@ nl_msg_reserve(struct ofpbuf *msg, size_t size) ofpbuf_prealloc_tailroom(msg, NLMSG_ALIGN(size)); } -static uint32_t -get_nlmsg_seq(void) -{ - /* Next nlmsghdr sequence number. - * - * This implementation uses sequence numbers that are unique process-wide, - * to avoid a hypothetical race: send request, close socket, open new - * socket that reuses the old socket's PID value, send request on new - * socket, receive reply from kernel to old socket but with same PID and - * sequence number. (This race could be avoided other ways, e.g. by - * preventing PIDs from being quickly reused). */ - static uint32_t next_seq; - - if (next_seq == 0) { - /* Pick initial sequence number. */ - next_seq = getpid() ^ time_wall(); - } - return next_seq++; -} - /* Puts a nlmsghdr at the beginning of 'msg', which must be initially empty. * Uses the given 'type' and 'flags'. 'expected_payload' should be * an estimate of the number of payload bytes to be supplied; if the size of @@ -121,8 +100,9 @@ get_nlmsg_seq(void) * is often NLM_F_REQUEST indicating that a request is being made, commonly * or'd with NLM_F_ACK to request an acknowledgement. * - * Sets the new nlmsghdr's nlmsg_pid field to 0 for now. nl_sock_send() will - * fill it in just before sending the message. + * Sets the new nlmsghdr's nlmsg_len, nlmsg_seq, and nlmsg_pid fields to 0 for + * now. Functions that send Netlink messages will fill these in just before + * sending the message. * * nl_msg_put_genlmsghdr() is more convenient for composing a Generic Netlink * message. */ @@ -132,14 +112,14 @@ nl_msg_put_nlmsghdr(struct ofpbuf *msg, { struct nlmsghdr *nlmsghdr; - assert(msg->size == 0); + ovs_assert(msg->size == 0); nl_msg_reserve(msg, NLMSG_HDRLEN + expected_payload); nlmsghdr = nl_msg_put_uninit(msg, NLMSG_HDRLEN); nlmsghdr->nlmsg_len = 0; nlmsghdr->nlmsg_type = type; nlmsghdr->nlmsg_flags = flags; - nlmsghdr->nlmsg_seq = get_nlmsg_seq(); + nlmsghdr->nlmsg_seq = 0; nlmsghdr->nlmsg_pid = 0; } @@ -171,7 +151,7 @@ nl_msg_put_genlmsghdr(struct ofpbuf *msg, size_t expected_payload, struct genlmsghdr *genlmsghdr; nl_msg_put_nlmsghdr(msg, GENL_HDRLEN + expected_payload, family, flags); - assert(msg->size == NLMSG_HDRLEN); + ovs_assert(msg->size == NLMSG_HDRLEN); genlmsghdr = nl_msg_put_uninit(msg, GENL_HDRLEN); genlmsghdr->cmd = cmd; genlmsghdr->version = version; @@ -233,7 +213,7 @@ nl_msg_put_unspec_uninit(struct ofpbuf *msg, uint16_t type, size_t size) { size_t total_size = NLA_HDRLEN + size; struct nlattr* nla = nl_msg_put_uninit(msg, total_size); - assert(NLA_ALIGN(total_size) <= UINT16_MAX); + ovs_assert(NLA_ALIGN(total_size) <= UINT16_MAX); nla->nla_len = total_size; nla->nla_type = type; return nla + 1; @@ -332,7 +312,7 @@ nl_msg_push_unspec_uninit(struct ofpbuf *msg, uint16_t type, size_t size) { size_t total_size = NLA_HDRLEN + size; struct nlattr* nla = nl_msg_push_uninit(msg, total_size); - assert(NLA_ALIGN(total_size) <= UINT16_MAX); + ovs_assert(NLA_ALIGN(total_size) <= UINT16_MAX); nla->nla_len = total_size; nla->nla_type = type; return nla + 1; @@ -493,7 +473,7 @@ nl_attr_type(const struct nlattr *nla) const void * nl_attr_get(const struct nlattr *nla) { - assert(nla->nla_len >= NLA_HDRLEN); + ovs_assert(nla->nla_len >= NLA_HDRLEN); return nla + 1; } @@ -501,7 +481,7 @@ nl_attr_get(const struct nlattr *nla) size_t nl_attr_get_size(const struct nlattr *nla) { - assert(nla->nla_len >= NLA_HDRLEN); + ovs_assert(nla->nla_len >= NLA_HDRLEN); return nla->nla_len - NLA_HDRLEN; } @@ -510,7 +490,7 @@ nl_attr_get_size(const struct nlattr *nla) const void * nl_attr_get_unspec(const struct nlattr *nla, size_t size) { - assert(nla->nla_len >= NLA_HDRLEN + size); + ovs_assert(nla->nla_len >= NLA_HDRLEN + size); return nla + 1; } @@ -596,8 +576,8 @@ nl_attr_get_be64(const struct nlattr *nla) const char * nl_attr_get_string(const struct nlattr *nla) { - assert(nla->nla_len > NLA_HDRLEN); - assert(memchr(nl_attr_get(nla), '\0', nla->nla_len - NLA_HDRLEN) != NULL); + ovs_assert(nla->nla_len > NLA_HDRLEN); + ovs_assert(memchr(nl_attr_get(nla), '\0', nla->nla_len - NLA_HDRLEN)); return nl_attr_get(nla); }