| /* |
| * Copyright (C) 2009, The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.server.vpn; |
| |
| import android.util.Log; |
| |
| import java.io.IOException; |
| import java.io.Serializable; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| /** |
| * A helper class for managing native VPN daemons. |
| */ |
| class VpnDaemons implements Serializable { |
| static final long serialVersionUID = 1L; |
| private final String TAG = VpnDaemons.class.getSimpleName(); |
| |
| private static final String MTPD = "mtpd"; |
| private static final String IPSEC = "racoon"; |
| |
| private static final String L2TP = "l2tp"; |
| private static final String L2TP_PORT = "1701"; |
| |
| private static final String PPTP = "pptp"; |
| private static final String PPTP_PORT = "1723"; |
| |
| private static final String VPN_LINKNAME = "vpn"; |
| private static final String PPP_ARGS_SEPARATOR = ""; |
| |
| private List<DaemonProxy> mDaemonList = new ArrayList<DaemonProxy>(); |
| |
| public DaemonProxy startL2tp(String serverIp, String secret, |
| String username, String password) throws IOException { |
| return startMtpd(L2TP, serverIp, L2TP_PORT, secret, username, password, |
| false); |
| } |
| |
| public DaemonProxy startPptp(String serverIp, String username, |
| String password, boolean encryption) throws IOException { |
| return startMtpd(PPTP, serverIp, PPTP_PORT, null, username, password, |
| encryption); |
| } |
| |
| public DaemonProxy startIpsecForL2tp(String serverIp, String pskKey) |
| throws IOException { |
| DaemonProxy ipsec = startDaemon(IPSEC); |
| ipsec.sendCommand(serverIp, L2TP_PORT, pskKey); |
| return ipsec; |
| } |
| |
| public DaemonProxy startIpsecForL2tp(String serverIp, String userKeyKey, |
| String userCertKey, String caCertKey) throws IOException { |
| DaemonProxy ipsec = startDaemon(IPSEC); |
| ipsec.sendCommand(serverIp, L2TP_PORT, userKeyKey, userCertKey, |
| caCertKey); |
| return ipsec; |
| } |
| |
| public synchronized void stopAll() { |
| new DaemonProxy(MTPD).stop(); |
| new DaemonProxy(IPSEC).stop(); |
| } |
| |
| public synchronized void closeSockets() { |
| for (DaemonProxy s : mDaemonList) s.closeControlSocket(); |
| } |
| |
| public synchronized boolean anyDaemonStopped() { |
| for (DaemonProxy s : mDaemonList) { |
| if (s.isStopped()) { |
| Log.w(TAG, " VPN daemon gone: " + s.getName()); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public synchronized int getSocketError() { |
| for (DaemonProxy s : mDaemonList) { |
| int errCode = getResultFromSocket(s); |
| if (errCode != 0) return errCode; |
| } |
| return 0; |
| } |
| |
| private synchronized DaemonProxy startDaemon(String daemonName) |
| throws IOException { |
| DaemonProxy daemon = new DaemonProxy(daemonName); |
| mDaemonList.add(daemon); |
| daemon.start(); |
| return daemon; |
| } |
| |
| private int getResultFromSocket(DaemonProxy s) { |
| try { |
| return s.getResultFromSocket(); |
| } catch (IOException e) { |
| return -1; |
| } |
| } |
| |
| private DaemonProxy startMtpd(String protocol, |
| String serverIp, String port, String secret, String username, |
| String password, boolean encryption) throws IOException { |
| ArrayList<String> args = new ArrayList<String>(); |
| args.addAll(Arrays.asList(protocol, serverIp, port)); |
| if (secret != null) args.add(secret); |
| args.add(PPP_ARGS_SEPARATOR); |
| addPppArguments(args, serverIp, username, password, encryption); |
| |
| DaemonProxy mtpd = startDaemon(MTPD); |
| mtpd.sendCommand(args.toArray(new String[args.size()])); |
| return mtpd; |
| } |
| |
| private static void addPppArguments(ArrayList<String> args, String serverIp, |
| String username, String password, boolean encryption) |
| throws IOException { |
| args.addAll(Arrays.asList( |
| "linkname", VPN_LINKNAME, |
| "name", username, |
| "password", password, |
| "refuse-eap", "nodefaultroute", "usepeerdns", |
| "idle", "1800", |
| "mtu", "1400", |
| "mru", "1400")); |
| if (encryption) { |
| args.add("+mppe"); |
| } |
| } |
| } |