blob: 23b01aadc4eb24e5207eb83186d53afc9053faec [file] [log] [blame]
// Copyright 2018 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.
#include "shill/net/netlink_fd.h"
#include <linux/netlink.h>
#include <sys/socket.h>
#include <base/logging.h>
#include "shill/net/sockets.h"
namespace shill {
int OpenNetlinkSocketFD(Sockets* sockets,
int netlink_family,
int netlink_groups_mask) {
int sockfd =
sockets->Socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, netlink_family);
if (sockfd < 0) {
LOG(ERROR) << "Failed to open netlink socket";
return Sockets::kInvalidFileDescriptor;
}
if (sockets->SetReceiveBuffer(sockfd, kNetlinkReceiveBufferSize))
LOG(ERROR) << "Failed to increase receive buffer size";
struct sockaddr_nl addr;
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;
addr.nl_groups = netlink_groups_mask;
if (sockets->Bind(sockfd, reinterpret_cast<struct sockaddr*>(&addr),
sizeof(addr)) < 0) {
sockets->Close(sockfd);
LOG(ERROR) << "Netlink socket bind failed";
return Sockets::kInvalidFileDescriptor;
}
return sockfd;
}
} // namespace shill