19ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat/*
29ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat * Copyright (C) 2008 The Android Open Source Project
39ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat *
49ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat * Licensed under the Apache License, Version 2.0 (the "License");
59ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat * you may not use this file except in compliance with the License.
69ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat * You may obtain a copy of the License at
79ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat *
89ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat *      http://www.apache.org/licenses/LICENSE-2.0
99ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat *
109ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat * Unless required by applicable law or agreed to in writing, software
119ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat * distributed under the License is distributed on an "AS IS" BASIS,
129ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat * See the License for the specific language governing permissions and
149ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat * limitations under the License.
159ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat */
169ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat
179ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat#ifndef _NAT_CONTROLLER_H
189ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat#define _NAT_CONTROLLER_H
199ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat
20f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall#include <list>
2117de4f01bb665ab5bee735cfa1adaad80fcc6286Paul Jensen#include <string>
229ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat
234fcb4a0d90be5e00b16b558089bd69d3c414d382Lorenzo Colitti#include "NetdConstants.h"
244fcb4a0d90be5e00b16b558089bd69d3c414d382Lorenzo Colitti
259ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehatclass NatController {
269ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehatpublic:
2787475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran    NatController();
289ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat    virtual ~NatController();
299ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat
3087475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran    int enableNat(const char* intIface, const char* extIface);
3187475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran    int disableNat(const char* intIface, const char* extIface);
320031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall    int setupIptablesHooks();
339ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat
348e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey    static const char* LOCAL_FORWARD;
35e8164ddc8204b626c1144a0a504754bf6622c6fdLorenzo Colitti    static const char* LOCAL_MANGLE_FORWARD;
368e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey    static const char* LOCAL_NAT_POSTROUTING;
378917e45f7f8d49b645fd6ed10942dfe20c71ac0eLorenzo Colitti    static const char* LOCAL_RAW_PREROUTING;
38baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall    static const char* LOCAL_TETHER_COUNTERS_CHAIN;
398e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey
40f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall    // List of strings of interface pairs.
41f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall    std::list<std::string> ifacePairList;
42f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall
439ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehatprivate:
441caafe66a6b927fa5d8eb4c59ec9eb48b0b1b075Robert Greenwalt    int natCount;
451caafe66a6b927fa5d8eb4c59ec9eb48b0b1b075Robert Greenwalt
46be79d6547d93c0be373db811d3f0265a93a76f3fLorenzo Colitti    static std::string makeTetherCountingRule(const char *if1, const char *if2);
47be79d6547d93c0be373db811d3f0265a93a76f3fLorenzo Colitti    bool checkTetherCountingRuleExist(const std::string& pair_name);
48f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall
499ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat    int setDefaults();
50001f0a436e9fe0353dccd98ee34b91095d9ed1a1Rom Lemarchand    int runCmd(int argc, const char **argv);
51fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt    int setForwardRules(bool set, const char *intIface, const char *extIface);
52baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall    int setTetherCountingRules(bool add, const char *intIface, const char *extIface);
538e1cee9064af5b2e0d8095d5a6a05953616d7d4cLorenzo Colitti
548e1cee9064af5b2e0d8095d5a6a05953616d7d4cLorenzo Colitti    // For testing.
558e1cee9064af5b2e0d8095d5a6a05953616d7d4cLorenzo Colitti    friend class NatControllerTest;
568e1cee9064af5b2e0d8095d5a6a05953616d7d4cLorenzo Colitti    static int (*execFunction)(int, char **, int *, bool, bool);
574fcb4a0d90be5e00b16b558089bd69d3c414d382Lorenzo Colitti    static int (*iptablesRestoreFunction)(IptablesTarget, const std::string&);
589ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat};
599ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat
609ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat#endif
61