1/*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef INCLUDE_NETLINK_MSG_H
17#define INCLUDE_NETLINK_MSG_H
18
19#include <arpa/inet.h>
20#include <asm/types.h>
21#include <cstdlib>
22#include <cstring>
23#include <iostream>
24#include <linux/fib_rules.h>
25#include <linux/inet_diag.h>
26#include <linux/netlink.h>
27#include <linux/rtnetlink.h>
28#include <sys/socket.h>
29#include <sys/stat.h>
30#include <sys/types.h>
31#include <unistd.h>
32
33namespace OHOS {
34namespace nmd {
35constexpr uint32_t NETLINK_MAX_LEN = 1024;
36class NetlinkMsg {
37public:
38    NetlinkMsg(uint16_t flags, size_t maxBufLen, int32_t pid);
39    ~NetlinkMsg();
40    /**
41     * Add route message to nlmsghdr
42     *
43     * @param action Action name
44     * @param msg Added message
45     */
46    void AddRoute(uint16_t action, struct rtmsg msg);
47
48    /**
49     * Add rule message to nlmsghdr
50     *
51     * @param action Action name
52     * @param msg Added message
53     */
54    void AddRule(uint16_t action, struct fib_rule_hdr msg);
55
56    /**
57     * Add address message to nlmsghdr
58     *
59     * @param action Action name
60     * @param msg Added message
61     */
62    void AddAddress(uint16_t action, struct ifaddrmsg msg);
63
64    /**
65     * Add rtattr to nlmsghdr
66     *
67     * @param rtaType Rta type
68     * @param buf Rta data
69     * @param bufLen Rta data length
70     * @return Returns 0, add rtattr to nlmsghdr successfully, otherwise it will fail
71     */
72    int32_t AddAttr(uint16_t rtaType, void *data, size_t dataLen);
73
74    /**
75     * Add 16 bit rtattr to nlmsghdr
76     *
77     * @param rtaType Rta type
78     * @param data Rta data
79     * @return Returns 0, add 16 bit rtattr to nlmsghdr successfully, otherwise it will fail
80     */
81    int32_t AddAttr16(uint16_t rtaType, uint16_t data);
82
83    /**
84     * Add 32 bit rtattr to nlmsghdr for
85     *
86     * @param rtaType Rta type
87     * @param data Rta data
88     * @return Returns 0, add 32 bit rtattr to nlmsghdr successfully, otherwise it will fail
89     */
90    int32_t AddAttr32(uint16_t rtaType, uint32_t data);
91
92    /**
93     * Get the netlink message
94     *
95     * @return Netlink message struct
96     */
97    struct nlmsghdr *GetNetLinkMessage();
98
99private:
100    std::unique_ptr<char[]> msghdrBuf_;
101    struct nlmsghdr *netlinkMessage_;
102    size_t maxBufLen_;
103};
104} // namespace nmd
105} // namespace OHOS
106#endif // !INCLUDE_NETLINK_MSG_H
107