| // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // This code is derived from the 'iw' source code. The copyright and license |
| // of that code is as follows: |
| // |
| // Copyright (c) 2007, 2008 Johannes Berg |
| // Copyright (c) 2007 Andy Lutomirski |
| // Copyright (c) 2007 Mike Kershaw |
| // Copyright (c) 2008-2009 Luis R. Rodriguez |
| // |
| // Permission to use, copy, modify, and/or distribute this software for any |
| // purpose with or without fee is hereby granted, provided that the above |
| // copyright notice and this permission notice appear in all copies. |
| // |
| // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| |
| #include "shill/nl80211_socket.h" |
| |
| #include <ctype.h> |
| #include <errno.h> |
| |
| #include <net/if.h> |
| #include <netlink/attr.h> |
| #include <netlink/genl/ctrl.h> |
| #include <netlink/genl/family.h> |
| #include <netlink/genl/genl.h> |
| #include <netlink/msg.h> |
| #include <netlink/netlink.h> |
| |
| #include <iomanip> |
| #include <sstream> |
| #include <string> |
| |
| #include "shill/logging.h" |
| #include "shill/netlink_socket.h" |
| #include "shill/nl80211_message.h" |
| |
| using std::string; |
| |
| namespace shill { |
| |
| const char Nl80211Socket::kSocketFamilyName[] = "nl80211"; |
| |
| bool Nl80211Socket::Init() { |
| if (!NetlinkSocket::Init()) { |
| LOG(ERROR) << "NetlinkSocket didn't initialize."; |
| return false; |
| } |
| |
| family_id_ = genl_ctrl_resolve(GetNlSock(), kSocketFamilyName); |
| if (family_id_ < 0) { |
| LOG(ERROR) << kSocketFamilyName << " not found."; |
| return false; |
| } |
| |
| LOG(INFO) << "Nl80211Socket initialized successfully"; |
| return true; |
| } |
| |
| bool Nl80211Socket::AddGroupMembership(const string &group_name) { |
| int id = genl_ctrl_resolve_grp(GetNlSock(), |
| kSocketFamilyName, |
| group_name.c_str()); |
| if (id < 0) { |
| LOG(ERROR) << "No Id for group " << group_name; |
| return false; |
| } |
| int result = nl_socket_add_membership(GetNlSock(), id); |
| if (result != 0) { |
| LOG(ERROR) << "Failed to join netlink multicast group: " << result; |
| return false; |
| } |
| LOG(INFO) << " Group " << group_name << " added successfully"; |
| return true; |
| } |
| |
| } // namespace shill |