1/*
2 * Copyright (c) 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_SHARING_MANAGER_H
17#define INCLUDE_SHARING_MANAGER_H
18
19#include <memory>
20#include <mutex>
21#include <set>
22#include <string>
23#include <vector>
24
25#include "iptables_wrapper.h"
26#include "network_sharing.h"
27
28namespace OHOS {
29namespace nmd {
30class SharingManager {
31public:
32    SharingManager();
33    ~SharingManager() = default;
34
35    /*
36     * @brief Enable IP forwarding
37     *
38     * @param requestor
39     * @return NETMANAGER_ERROR code
40     */
41    int32_t IpEnableForwarding(const std::string &requestor);
42
43    /*
44     * @brief Disable IP forwarding
45     *
46     * @param requestor
47     * @return NETMANAGER_ERROR code
48     */
49    int32_t IpDisableForwarding(const std::string &requestor);
50
51    /*
52     * @brief Enable network address forwarding
53     *
54     * @param downstreamIface
55     * @param upstreamIface
56     * @return NETMANAGER_ERROR code
57     */
58    int32_t EnableNat(const std::string &downstreamIface, const std::string &upstreamIface);
59
60    /*
61     * @brief Disable network address forwarding
62     *
63     * @param downstreamIface
64     * @param upstreamIface
65     * @return NETMANAGER_ERROR code
66     */
67    int32_t DisableNat(const std::string &downstramIface, const std::string &upstreamIface);
68
69    /*
70     * @brief According to the network cark configuration rules of iptables
71     *
72     * @param fromIface
73     * @param toIface
74     * @return NETMANAGER_ERROR code
75     */
76    int32_t IpfwdAddInterfaceForward(const std::string &fromIface, const std::string &toIface);
77
78    /*
79     * @brief According to the network cark configuration rules of iptables
80     *
81     * @param fromIface
82     * @param toIface
83     * @return NETMANAGER_ERROR code
84     */
85    int32_t IpfwdRemoveInterfaceForward(const std::string &fromIface, const std::string &toIface);
86
87    /*
88     * @brief Get trafic of network sharing
89     *
90     * @param downIface
91     * @param upIface
92     * @param traffic
93     * @return NETMANAGER_ERROR code
94     */
95    int32_t GetNetworkSharingTraffic(const std::string &downIface, const std::string &upIface,
96                                     NetworkSharingTraffic &traffic);
97
98    int32_t SetIpv6PrivacyExtensions(const std::string &interfaceName, const uint32_t on);
99    int32_t SetEnableIpv6(const std::string &interfaceName, const uint32_t on);
100private:
101    std::set<std::string> forwardingRequests_;
102    std::set<std::string> interfaceForwards_;
103    std::shared_ptr<IptablesWrapper> iptablesWrapper_ = nullptr;
104    bool inited_ = false;
105    std::mutex initedMutex_;
106
107    void IpfwdExecSaveBak();
108    void InitChildChains();
109    void CheckInited();
110    int32_t SetIpFwdEnable();
111    int32_t SetForwardRules(bool set, const std::string &cmds);
112};
113} // namespace nmd
114} // namespace OHOS
115#endif // INCLUDE_SHARING_MANAGER_H
116