shill: Combines user- and kernel-bound nl80211 messages.

The UserBoundNlMessage and KernelBoundNlMessage classes are merged
into Nl80211Message.

As part of combining the two messages, the code was modified to use raw
socket writes instead of using libnl (in order to test kernel-bound
Nl80211Message writing) for sending a message.  Note, however, that
libnl code is still liberally used; there's just less use of it than
before.  Some (a little) effort was made to be consistent with the
RTNLHandler code toward combining the codebases, eventually.

BUG=chromium-os:36099, chromium-os:36638
TEST=unittests and manual tests (I added code to create an
Nl80211Message, send that message to the kernel, and display the output;
I hand inspected the output).

Change-Id: I7b04e49cee84745d1b02f1dd2b064f9e9a0aada2
Reviewed-on: https://gerrit.chromium.org/gerrit/40266
Commit-Queue: Wade Guthrie <wdg@chromium.org>
Reviewed-by: Wade Guthrie <wdg@chromium.org>
Tested-by: Wade Guthrie <wdg@chromium.org>
diff --git a/config80211.cc b/config80211.cc
index 320e9cc..21d794a 100644
--- a/config80211.cc
+++ b/config80211.cc
@@ -15,11 +15,10 @@
 #include <base/stl_util.h>
 
 #include "shill/io_handler.h"
-#include "shill/kernel_bound_nlmessage.h"
 #include "shill/logging.h"
+#include "shill/nl80211_message.h"
 #include "shill/nl80211_socket.h"
 #include "shill/scope_logger.h"
-#include "shill/user_bound_nlmessage.h"
 
 using base::Bind;
 using base::LazyInstance;
@@ -146,14 +145,18 @@
   broadcast_callbacks_.clear();
 }
 
-bool Config80211::SendMessage(KernelBoundNlMessage *message,
+bool Config80211::SendMessage(Nl80211Message *message,
                               const Callback &callback) {
   if (!message) {
     LOG(ERROR) << "Message is NULL.";
     return false;
   }
-  uint32 sequence_number = sock_->Send(message);
+  uint32 sequence_number = message->sequence_number();
   if (!sequence_number) {
+    sequence_number = sock_->GetSequenceNumber();
+    message->set_sequence_number(sequence_number);
+  }
+  if (!sock_->SendMessage(message)) {
     LOG(ERROR) << "Failed to send nl80211 message.";
     return false;
   }
@@ -170,7 +173,7 @@
   return true;
 }
 
-bool Config80211::RemoveMessageCallback(const KernelBoundNlMessage &message) {
+bool Config80211::RemoveMessageCallback(const Nl80211Message &message) {
   if (!ContainsKey(message_callbacks_, message.sequence_number())) {
     return false;
   }
@@ -281,8 +284,7 @@
   const uint32 sequence_number = msg->nlmsg_seq;
   SLOG(WiFi, 3) << "\t  Entering " << __func__
                 << "( msg:" << sequence_number << ")";
-  scoped_ptr<UserBoundNlMessage> message(
-      UserBoundNlMessageFactory::CreateMessage(msg));
+  scoped_ptr<Nl80211Message> message(Nl80211MessageFactory::CreateMessage(msg));
   if (message == NULL) {
     SLOG(WiFi, 3) << __func__ << "(msg:NULL)";
     return NL_SKIP;  // Skip current message, continue parsing buffer.