1dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat/*
2dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * Copyright (C) 2008 The Android Open Source Project
3dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat *
4dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * Licensed under the Apache License, Version 2.0 (the "License");
5dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * you may not use this file except in compliance with the License.
6dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * You may obtain a copy of the License at
7dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat *
8dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat *      http://www.apache.org/licenses/LICENSE-2.0
9dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat *
10dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * Unless required by applicable law or agreed to in writing, software
11dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * distributed under the License is distributed on an "AS IS" BASIS,
12dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * See the License for the specific language governing permissions and
14dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * limitations under the License.
15dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat */
165d6d417972f8d946c223c4efb9636b1ba4280543San Mehat
174876567cb9c6a69ce21fd2b1c5bcce5a6f274276San Mehat#include <stdio.h>
185d6d417972f8d946c223c4efb9636b1ba4280543San Mehat#include <string.h>
193c5a6f0bc8aefc4dacab8e95ba9017a7ac7d91f5San Mehat#include <stdlib.h>
20dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat#include <errno.h>
215d6d417972f8d946c223c4efb9636b1ba4280543San Mehat#include <sys/socket.h>
225d6d417972f8d946c223c4efb9636b1ba4280543San Mehat#include <netinet/in.h>
235d6d417972f8d946c223c4efb9636b1ba4280543San Mehat#include <arpa/inet.h>
245d6d417972f8d946c223c4efb9636b1ba4280543San Mehat
253c5a6f0bc8aefc4dacab8e95ba9017a7ac7d91f5San Mehat#include "PropertyManager.h"
26dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat#include "VpnController.h"
27dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat
283aff2d1de59972684bf2ab798351be5544158239San MehatVpnController::VpnController(PropertyManager *propmngr,
293aff2d1de59972684bf2ab798351be5544158239San Mehat                             IControllerHandler *handlers) :
30c4a895b7094461c98101924cf096680bfb7856f1San Mehat               Controller("vpn", propmngr, handlers) {
313c5a6f0bc8aefc4dacab8e95ba9017a7ac7d91f5San Mehat    mEnabled = false;
32c4a895b7094461c98101924cf096680bfb7856f1San Mehat
33c4a895b7094461c98101924cf096680bfb7856f1San Mehat    mStaticProperties.propEnabled = new VpnEnabledProperty(this);
34c4a895b7094461c98101924cf096680bfb7856f1San Mehat    mDynamicProperties.propGateway = new IPV4AddressPropertyHelper("Gateway",
35c4a895b7094461c98101924cf096680bfb7856f1San Mehat                                                                   false,
36c4a895b7094461c98101924cf096680bfb7856f1San Mehat                                                                   &mGateway);
37dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat}
38dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat
39dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehatint VpnController::start() {
40c4a895b7094461c98101924cf096680bfb7856f1San Mehat    mPropMngr->attachProperty("vpn", mStaticProperties.propEnabled);
413c5a6f0bc8aefc4dacab8e95ba9017a7ac7d91f5San Mehat    return 0;
42dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat}
43dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat
44dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehatint VpnController::stop() {
45c4a895b7094461c98101924cf096680bfb7856f1San Mehat    mPropMngr->detachProperty("vpn", mStaticProperties.propEnabled);
463c5a6f0bc8aefc4dacab8e95ba9017a7ac7d91f5San Mehat    return 0;
47dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat}
48dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat
49c4a895b7094461c98101924cf096680bfb7856f1San MehatVpnController::VpnIntegerProperty::VpnIntegerProperty(VpnController *c,
50c4a895b7094461c98101924cf096680bfb7856f1San Mehat                                                      const char *name,
51c4a895b7094461c98101924cf096680bfb7856f1San Mehat                                                      bool ro,
52c4a895b7094461c98101924cf096680bfb7856f1San Mehat                                                      int elements) :
53c4a895b7094461c98101924cf096680bfb7856f1San Mehat                IntegerProperty(name, ro, elements) {
54c4a895b7094461c98101924cf096680bfb7856f1San Mehat    mVc = c;
55c4a895b7094461c98101924cf096680bfb7856f1San Mehat}
565d6d417972f8d946c223c4efb9636b1ba4280543San Mehat
57c4a895b7094461c98101924cf096680bfb7856f1San MehatVpnController::VpnStringProperty::VpnStringProperty(VpnController *c,
58c4a895b7094461c98101924cf096680bfb7856f1San Mehat                                                    const char *name,
59c4a895b7094461c98101924cf096680bfb7856f1San Mehat                                                    bool ro, int elements) :
60c4a895b7094461c98101924cf096680bfb7856f1San Mehat                StringProperty(name, ro, elements) {
61c4a895b7094461c98101924cf096680bfb7856f1San Mehat    mVc = c;
62c4a895b7094461c98101924cf096680bfb7856f1San Mehat}
634876567cb9c6a69ce21fd2b1c5bcce5a6f274276San Mehat
64c4a895b7094461c98101924cf096680bfb7856f1San MehatVpnController::VpnIPV4AddressProperty::VpnIPV4AddressProperty(VpnController *c,
65c4a895b7094461c98101924cf096680bfb7856f1San Mehat                                                              const char *name,
66c4a895b7094461c98101924cf096680bfb7856f1San Mehat                                                              bool ro, int elements) :
67c4a895b7094461c98101924cf096680bfb7856f1San Mehat                IPV4AddressProperty(name, ro, elements) {
68c4a895b7094461c98101924cf096680bfb7856f1San Mehat    mVc = c;
695d6d417972f8d946c223c4efb9636b1ba4280543San Mehat}
705d6d417972f8d946c223c4efb9636b1ba4280543San Mehat
71c4a895b7094461c98101924cf096680bfb7856f1San MehatVpnController::VpnEnabledProperty::VpnEnabledProperty(VpnController *c) :
72c4a895b7094461c98101924cf096680bfb7856f1San Mehat                VpnIntegerProperty(c, "Enabled", false, 1) {
73c4a895b7094461c98101924cf096680bfb7856f1San Mehat}
74c4a895b7094461c98101924cf096680bfb7856f1San Mehatint VpnController::VpnEnabledProperty::get(int idx, int *buffer) {
75c4a895b7094461c98101924cf096680bfb7856f1San Mehat    *buffer = mVc->mEnabled;
76c4a895b7094461c98101924cf096680bfb7856f1San Mehat    return 0;
77c4a895b7094461c98101924cf096680bfb7856f1San Mehat}
78c4a895b7094461c98101924cf096680bfb7856f1San Mehatint VpnController::VpnEnabledProperty::set(int idx, int value) {
79c4a895b7094461c98101924cf096680bfb7856f1San Mehat    int rc;
80c4a895b7094461c98101924cf096680bfb7856f1San Mehat    if (!value) {
81c4a895b7094461c98101924cf096680bfb7856f1San Mehat        mVc->mPropMngr->detachProperty("vpn", mVc->mDynamicProperties.propGateway);
82c4a895b7094461c98101924cf096680bfb7856f1San Mehat        rc = mVc->disable();
83c4a895b7094461c98101924cf096680bfb7856f1San Mehat    } else {
84c4a895b7094461c98101924cf096680bfb7856f1San Mehat        rc = mVc->enable();
85c4a895b7094461c98101924cf096680bfb7856f1San Mehat        if (!rc) {
86c4a895b7094461c98101924cf096680bfb7856f1San Mehat            mVc->mPropMngr->attachProperty("vpn", mVc->mDynamicProperties.propGateway);
87c4a895b7094461c98101924cf096680bfb7856f1San Mehat        }
884876567cb9c6a69ce21fd2b1c5bcce5a6f274276San Mehat    }
89c4a895b7094461c98101924cf096680bfb7856f1San Mehat    if (!rc)
90c4a895b7094461c98101924cf096680bfb7856f1San Mehat        mVc->mEnabled = value;
91c4a895b7094461c98101924cf096680bfb7856f1San Mehat    return rc;
925d6d417972f8d946c223c4efb9636b1ba4280543San Mehat}
93