blob: 11fb8e00157c68e7fee12ffc67d3612498424423 [file] [log] [blame]
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +09001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Bernie Innocenti762dcf42019-06-14 19:52:49 +090017#pragma once
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +090018
19#include <functional>
Lorenzo Colittif3e299a2017-02-14 17:24:28 +090020#include <linux/netlink.h>
21#include <linux/rtnetlink.h>
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +090022
23#include "NetdConstants.h"
24
Bernie Innocenti762dcf42019-06-14 19:52:49 +090025namespace android::net {
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +090026
27const sockaddr_nl KERNEL_NLADDR = {AF_NETLINK, 0, 0, 0};
28
Lorenzo Colittif3e299a2017-02-14 17:24:28 +090029const uint16_t NETLINK_REQUEST_FLAGS = NLM_F_REQUEST | NLM_F_ACK;
Lorenzo Colitti5c437992017-11-28 01:26:02 +090030const uint16_t NETLINK_ROUTE_CREATE_FLAGS = NETLINK_REQUEST_FLAGS | NLM_F_CREATE | NLM_F_EXCL;
Tyler Wearfa94a272019-12-05 15:01:48 -080031const uint16_t NETLINK_ROUTE_REPLACE_FLAGS = NETLINK_REQUEST_FLAGS | NLM_F_REPLACE;
Lorenzo Colitti5c437992017-11-28 01:26:02 +090032// Don't create rules with NLM_F_EXCL, because operations such as changing network permissions rely
33// on make-before-break. The kernel did not complain about duplicate rules until ~4.9, at which
34// point it started returning EEXIST. See for example b/69607866 . We can't just ignore the EEXIST
35// because if we hit it, the rule was not created, but we will think it was, and we'll then trip up
36// trying to delete it.
37const uint16_t NETLINK_RULE_CREATE_FLAGS = NETLINK_REQUEST_FLAGS | NLM_F_CREATE;
Lorenzo Colittif3e299a2017-02-14 17:24:28 +090038const uint16_t NETLINK_DUMP_FLAGS = NLM_F_REQUEST | NLM_F_DUMP;
39
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +090040// Generic code for processing netlink dumps.
41const int kNetlinkDumpBufferSize = 8192;
42typedef std::function<void(nlmsghdr *)> NetlinkDumpCallback;
Lorenzo Colittif3e299a2017-02-14 17:24:28 +090043typedef std::function<bool(nlmsghdr *)> NetlinkDumpFilter;
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +090044
45// Opens an RTNetlink socket and connects it to the kernel.
Bernie Innocenti762dcf42019-06-14 19:52:49 +090046[[nodiscard]] int openNetlinkSocket(int protocol);
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +090047
48// Receives a netlink ACK. Returns 0 if the command succeeded or negative errno if the command
49// failed or receiving the ACK failed.
Bernie Innocenti762dcf42019-06-14 19:52:49 +090050[[nodiscard]] int recvNetlinkAck(int sock);
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +090051
52// Sends a netlink request and possibly expects an ACK. The first element of iov should be null and
53// will be set to the netlink message headerheader. The subsequent elements are the contents of the
54// request.
Bernie Innocenti762dcf42019-06-14 19:52:49 +090055[[nodiscard]] int sendNetlinkRequest(uint16_t action, uint16_t flags, iovec* iov, int iovlen,
56 const NetlinkDumpCallback* callback);
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +090057
58// Processes a netlink dump, passing every message to the specified |callback|.
Bernie Innocenti762dcf42019-06-14 19:52:49 +090059[[nodiscard]] int processNetlinkDump(int sock, const NetlinkDumpCallback& callback);
Lorenzo Colitti1ef549d2017-02-13 18:32:09 +090060
Lorenzo Colittif3e299a2017-02-14 17:24:28 +090061// Flushes netlink objects that take an rtmsg structure (FIB rules, routes...). |getAction| and
62// |deleteAction| specify the netlink message types, e.g., RTM_GETRULE and RTM_DELRULE.
63// |shouldDelete| specifies whether a given object should be deleted or not. |what| is a
64// human-readable name for the objects being flushed, e.g. "rules".
Bernie Innocenti762dcf42019-06-14 19:52:49 +090065[[nodiscard]] int rtNetlinkFlush(uint16_t getAction, uint16_t deleteAction, const char* what,
66 const NetlinkDumpFilter& shouldDelete);
Lorenzo Colittif3e299a2017-02-14 17:24:28 +090067
68// Returns the value of the specific __u32 attribute, or 0 if the attribute was not present.
69uint32_t getRtmU32Attribute(const nlmsghdr *nlh, int attribute);
70
Bernie Innocenti762dcf42019-06-14 19:52:49 +090071} // namespace android::net