Home | History | Annotate | Download | only in mtpd
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /* A simple implementation of PPTP Network Server (RFC 2637) which only
     18  * creates a single session. The following code only handles control packets.
     19  * Data packets are handled by PPPoPNS driver which can be found in Android
     20  * kernel tree. */
     21 
     22 #include <stdbool.h>
     23 #include <stdio.h>
     24 #include <stdlib.h>
     25 #include <string.h>
     26 #include <errno.h>
     27 #include <sys/types.h>
     28 #include <sys/socket.h>
     29 #include <netdb.h>
     30 #include <unistd.h>
     31 #include <arpa/inet.h>
     32 #include <linux/netdevice.h>
     33 #include <linux/if_pppox.h>
     34 #include <linux/types.h>
     35 
     36 #include "mtpd.h"
     37 
     38 enum pptp_message {
     39     SCCRQ = 1,
     40     SCCRP = 2,
     41     STOPCCRQ = 3,
     42     STOPCCRP = 4,
     43     ECHORQ = 5,
     44     ECHORP = 6,
     45     OCRQ = 7,
     46     OCRP = 8,
     47     ICRQ = 9,
     48     ICRP = 10,
     49     ICCN = 11,
     50     CCRQ = 12,
     51     CDN = 13,
     52     WEN = 14,
     53     SLI = 15,
     54     MESSAGE_MAX = 15,
     55 };
     56 
     57 static char *messages[] = {
     58     NULL, "SCCRQ", "SCCRP", "STOPCCRQ", "STOPCCRP", "ECHORQ", "ECHORP",
     59     "OCRQ", "OCRP", "ICRQ", "ICRP", "ICCN", "CCRQ", "CDN", "WEN", "SLI",
     60 };
     61 
     62 static uint8_t lengths[] = {
     63     0, 156, 156, 16, 16, 16, 20, 168, 32, 220, 24, 28, 16, 148, 40, 24,
     64 };
     65 
     66 #define CONTROL_MESSAGE         htons(1)
     67 #define MAGIC_COOKIE            htonl(0x1A2B3C4D)
     68 #define PROTOCOL_VERSION        htons(0x0100)
     69 
     70 #define RESULT_OK               1
     71 #define RESULT_ERROR            2
     72 
     73 /* Some implementation uses 0 instead of 1, so we allow both of them. */
     74 #define ESTABLISHED(result)     (result <= 1)
     75 
     76 #define HEADER_SIZE             8
     77 #define MIN_MESSAGE_SIZE        10
     78 
     79 static __be16 local;
     80 static __be16 remote;
     81 static uint16_t state;
     82 static const char *remote_name;    /* server host name or IP address */
     83 
     84 #define MAX_PACKET_LENGTH       220
     85 
     86 /* We define all the fields we used in this structure. Type conversion and byte
     87  * alignment are solved in one place. Although it looks a little bit ugly, it
     88  * really makes life easier. */
     89 static struct packet {
     90     int length;
     91     int expect;
     92     union {
     93         uint8_t buffer[MAX_PACKET_LENGTH];
     94         struct {
     95             struct __attribute__((packed)) {
     96                 uint16_t length;
     97                 uint16_t type;
     98                 uint32_t cookie;
     99             } header;
    100             uint16_t message;
    101             uint16_t reserved;
    102             union {
    103                 struct __attribute__((packed)) {
    104                     uint16_t protocol_version;
    105                     uint8_t result;
    106                     uint8_t error;
    107                     uint32_t framing;
    108                     uint32_t bearer;
    109                     uint16_t channels;
    110                     uint16_t firmware_revision;
    111                     char host[64];
    112                 } sccrp, sccrq;
    113                 struct __attribute__((packed)) {
    114                     uint16_t call;
    115                     uint16_t serial;
    116                     uint32_t minimum_speed;
    117                     uint32_t maximum_speed;
    118                     uint32_t bearer;
    119                     uint32_t framing;
    120                     uint16_t window_size;
    121                 } ocrq;
    122                 struct __attribute__((packed)) {
    123                     uint16_t call;
    124                     uint16_t peer;
    125                     uint8_t result;
    126                 } ocrp, icrp;
    127                 struct __attribute__((packed)) {
    128                     uint32_t identifier;
    129                     uint8_t result;
    130                 } echorq, echorp;
    131                 struct __attribute__((packed)) {
    132                     uint16_t call;
    133                 } icrq, ccrq, cdn;
    134             };
    135         } __attribute__((packed));
    136     } __attribute__((aligned(4)));
    137 } incoming, outgoing;
    138 
    139 static void set_message(uint16_t message)
    140 {
    141     uint16_t length = lengths[message];
    142     memset(outgoing.buffer, 0, length);
    143     outgoing.length = length;
    144     outgoing.header.length = htons(length);
    145     outgoing.header.type = CONTROL_MESSAGE;
    146     outgoing.header.cookie = MAGIC_COOKIE;
    147     outgoing.message = htons(message);
    148 }
    149 
    150 static void send_packet()
    151 {
    152     send(the_socket, outgoing.buffer, outgoing.length, 0);
    153 }
    154 
    155 static int recv_packet()
    156 {
    157     int length;
    158 
    159     /* We are going to read a new message if incoming.expect is 0. */
    160     if (!incoming.expect) {
    161         incoming.length = 0;
    162         incoming.expect = HEADER_SIZE;
    163     }
    164 
    165     /* The longest message defined in RFC 2637 is 220 bytes, but the protocol
    166      * itself allows up to 65536 bytes. Therefore we always read a complete
    167      * message but only keep the first 220 bytes before passing up. */
    168     length = incoming.expect - incoming.length;
    169     if (incoming.length >= MAX_PACKET_LENGTH) {
    170         uint8_t buffer[length];
    171         length = recv(the_socket, buffer, length, 0);
    172     } else {
    173         if (incoming.expect > MAX_PACKET_LENGTH) {
    174             length = MAX_PACKET_LENGTH - incoming.length;
    175         }
    176         length = recv(the_socket, &incoming.buffer[incoming.length], length, 0);
    177     }
    178     if (length == -1) {
    179         if (errno == EINTR) {
    180             return 0;
    181         }
    182         log_print(FATAL, "Recv() %s", strerror(errno));
    183         exit(NETWORK_ERROR);
    184     }
    185     if (length == 0) {
    186         log_print(DEBUG, "Connection closed");
    187         log_print(INFO, "Remote server hung up");
    188         return -REMOTE_REQUESTED;
    189     }
    190     incoming.length += length;
    191 
    192     /* If incoming.header is valid, check cookie and update incoming.expect. */
    193     if (incoming.length == HEADER_SIZE && incoming.expect == HEADER_SIZE) {
    194         if (incoming.header.cookie != MAGIC_COOKIE) {
    195             log_print(DEBUG, "Loss of synchronization");
    196             log_print(ERROR, "Protocol error");
    197             return -PROTOCOL_ERROR;
    198         }
    199         incoming.expect = ntohs(incoming.header.length);
    200         if (incoming.expect < HEADER_SIZE) {
    201             log_print(DEBUG, "Invalid message length");
    202             log_print(ERROR, "Protocol error");
    203             return -PROTOCOL_ERROR;
    204         }
    205     }
    206 
    207     /* Now we have a complete message. Reset incoming.expect. */
    208     if (incoming.length == incoming.expect) {
    209         incoming.expect = 0;
    210 
    211         /* Return 1 if it is a control message. */
    212         if (incoming.header.type == CONTROL_MESSAGE) {
    213             return 1;
    214         }
    215         log_print(DEBUG, "Ignored non-control message (type = %u)",
    216                 (unsigned)ntohs(incoming.header.type));
    217     }
    218     return 0;
    219 }
    220 
    221 static int pptp_connect(char **arguments)
    222 {
    223     remote_name = arguments[0];
    224 
    225     create_socket(AF_UNSPEC, SOCK_STREAM, arguments[0], arguments[1]);
    226 
    227     log_print(DEBUG, "Sending SCCRQ");
    228     state = SCCRQ;
    229     set_message(SCCRQ);
    230     outgoing.sccrq.protocol_version = PROTOCOL_VERSION;
    231     outgoing.sccrq.framing = htonl(3);
    232     outgoing.sccrq.bearer = htonl(3);
    233     outgoing.sccrq.channels = htons(1);
    234     strcpy(outgoing.sccrq.host, "anonymous");
    235     send_packet();
    236     return 0;
    237 }
    238 
    239 /**
    240  * Check if upstream kernel implementation of PPTP should be used.
    241  *
    242  * @return true If upstream PPTP should be used, which is the case if
    243  *              the obsolete OPNS feature is not available.
    244  */
    245 static bool check_pptp(void)
    246 {
    247     int fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OPNS);
    248 
    249     if (fd < 0) {
    250         return true;
    251     } else {
    252         close(fd);
    253         return false;
    254     }
    255 }
    256 
    257 /**
    258  * Create OPNS session.
    259  *
    260  * @deprecated It will be removed soon in favor of upstream PPTP.
    261  *
    262  * @return PPPoX socket file descriptor
    263  */
    264 static int create_pppox_opns(void)
    265 {
    266     int pppox;
    267 
    268     log_print(WARNING, "Using deprecated OPNS protocol. "
    269                        "Its support will be removed soon. "
    270                        "Please enable PPTP support in your kernel");
    271 
    272     log_print(INFO, "Creating PPPoX socket");
    273     pppox = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OPNS);
    274 
    275     if (pppox == -1) {
    276         log_print(FATAL, "Socket() %s", strerror(errno));
    277         exit(SYSTEM_ERROR);
    278     } else {
    279         struct sockaddr_pppopns address = {
    280             .sa_family = AF_PPPOX,
    281             .sa_protocol = PX_PROTO_OPNS,
    282             .tcp_socket = the_socket,
    283             .local = local,
    284             .remote = remote,
    285         };
    286         if (connect(pppox, (struct sockaddr *)&address, sizeof(address))) {
    287             log_print(FATAL, "Connect() %s", strerror(errno));
    288             exit(SYSTEM_ERROR);
    289         }
    290     }
    291     return pppox;
    292 }
    293 
    294 /**
    295  * Get IP address by host name.
    296  *
    297  * @param name Host name to get IP address for
    298  *
    299  * @return IP address for given host name
    300  */
    301 static struct in_addr get_addr_by_name(const char *name)
    302 {
    303     struct addrinfo hints;
    304     struct addrinfo *res, *rp;
    305     struct in_addr addr;
    306     int err;
    307 
    308     memset(&hints, 0, sizeof(struct addrinfo));
    309     hints.ai_family = AF_INET;       /* allow only IPv4 */
    310     hints.ai_socktype = SOCK_DGRAM;  /* UDP */
    311     hints.ai_protocol = 0;           /* any protocol */
    312 
    313     err = getaddrinfo(name, NULL, &hints, &res);
    314     if (err) {
    315         log_print(FATAL, "%s: getaddrinfo: %s", __func__, gai_strerror(err));
    316         exit(SYSTEM_ERROR);
    317     }
    318 
    319     for (rp = res; rp != NULL; rp = rp->ai_next) {
    320         /* For now we only support IPv4 */
    321         if (rp->ai_family == AF_INET) {
    322             addr = ((struct sockaddr_in *)rp->ai_addr)->sin_addr;
    323             break;
    324         }
    325     }
    326 
    327     if (rp == NULL) {
    328         log_print(FATAL, "%s: No IPv4 addresses found", __func__);
    329         freeaddrinfo(res);
    330         exit(SYSTEM_ERROR);
    331     }
    332 
    333     freeaddrinfo(res);
    334 
    335     return addr;
    336 }
    337 
    338 /**
    339  * Get local IP address.
    340  *
    341  * Make a socket connection with remote server and then call getsockname() on
    342  * the connected socket. This will return the local IP address.
    343  *
    344  * @param remote_addr Server IP address
    345  *
    346  * @return Local IP address
    347  */
    348 static struct in_addr get_local_addr(struct in_addr remote_addr)
    349 {
    350     int sock;
    351     struct sockaddr_in addr;
    352     socklen_t addr_len;
    353 
    354     addr_len = sizeof(struct sockaddr_in);
    355     addr.sin_addr = remote_addr;
    356     addr.sin_family = AF_INET;
    357     addr.sin_port = htons(0);
    358 
    359     sock = socket(AF_INET, SOCK_DGRAM, 0);
    360     if (sock < 0) {
    361         log_print(FATAL, "%s: Socket() %s", __func__, strerror(errno));
    362         exit(SYSTEM_ERROR);
    363     }
    364 
    365     if (connect(sock, (struct sockaddr*)&addr, sizeof(addr))) {
    366         close(sock);
    367         log_print(FATAL, "%s: Connect() %s", __func__, strerror(errno));
    368         exit(SYSTEM_ERROR);
    369     }
    370 
    371     getsockname(sock, (struct sockaddr*)&addr, &addr_len);
    372     close(sock);
    373 
    374     return addr.sin_addr;
    375 }
    376 
    377 /**
    378  * Create PPTP session.
    379  *
    380  * @return PPTP socket file descriptor
    381  */
    382 static int create_pppox_pptp(void)
    383 {
    384     int pptp_fd;
    385     struct sockaddr_pppox src, dst;
    386     struct in_addr remote_addr; /* server IP address */
    387     struct in_addr local_addr;  /* client IP address */
    388 
    389     remote_addr = get_addr_by_name(remote_name);
    390     local_addr = get_local_addr(remote_addr);
    391 
    392     src.sa_family = AF_PPPOX;
    393     src.sa_protocol = PX_PROTO_PPTP;
    394     src.sa_addr.pptp.call_id = ntohs(local);
    395     src.sa_addr.pptp.sin_addr = local_addr;
    396 
    397     dst.sa_family = AF_PPPOX;
    398     dst.sa_protocol = PX_PROTO_PPTP;
    399     dst.sa_addr.pptp.call_id = ntohs(remote);
    400     dst.sa_addr.pptp.sin_addr = remote_addr;
    401 
    402     pptp_fd = socket(AF_PPPOX, SOCK_STREAM, PX_PROTO_PPTP);
    403     if (pptp_fd < 0) {
    404         log_print(FATAL, "Failed to create PPTP socket (%s)", strerror(errno));
    405         exit(SYSTEM_ERROR);
    406     }
    407 
    408     if (bind(pptp_fd, (struct sockaddr*)&src, sizeof(src))) {
    409         log_print(FATAL, "Failed to bind PPTP socket (%s)", strerror(errno));
    410         close(pptp_fd);
    411         exit(SYSTEM_ERROR);
    412     }
    413 
    414     if (connect(pptp_fd, (struct sockaddr*)&dst, sizeof(dst))) {
    415         log_print(FATAL, "Failed to connect PPTP socket (%s)", strerror(errno));
    416         close(pptp_fd);
    417         exit(SYSTEM_ERROR);
    418     }
    419 
    420     return pptp_fd;
    421 }
    422 
    423 static int pptp_process()
    424 {
    425     int result = recv_packet();
    426     if (result <= 0) {
    427         return result;
    428     }
    429 
    430     if (incoming.length < MIN_MESSAGE_SIZE) {
    431         log_print(DEBUG, "Control message too short");
    432         return 0;
    433     }
    434     incoming.message = ntohs(incoming.message);
    435     if (incoming.message > MESSAGE_MAX || !messages[incoming.message]) {
    436         log_print(DEBUG, "Received UNKNOWN %d", incoming.message);
    437         return 0;
    438     }
    439     if (incoming.length < lengths[incoming.message]) {
    440         log_print(DEBUG, "Received %s with invalid length (length = %d)",
    441                 messages[incoming.message], incoming.length);
    442         return 0;
    443     }
    444 
    445     switch(incoming.message) {
    446         case SCCRP:
    447             if (state == SCCRQ) {
    448                 if (incoming.sccrp.protocol_version == PROTOCOL_VERSION &&
    449                         ESTABLISHED(incoming.sccrp.result)) {
    450                     while (!local) {
    451                         local = random();
    452                     }
    453                     log_print(DEBUG, "Received SCCRP -> Sending OCRQ "
    454                             "(local = %u)", (unsigned)ntohs(local));
    455                     log_print(INFO, "Tunnel established");
    456                     state = OCRQ;
    457                     set_message(OCRQ);
    458                     outgoing.ocrq.call = local;
    459                     outgoing.ocrq.serial = random();
    460                     outgoing.ocrq.minimum_speed = htonl(1000);
    461                     outgoing.ocrq.maximum_speed = htonl(100000000);
    462                     outgoing.ocrq.bearer = htonl(3);
    463                     outgoing.ocrq.framing = htonl(3);
    464                     outgoing.ocrq.window_size = htons(8192);
    465                     send_packet();
    466                     return 0;
    467                 }
    468                 log_print(DEBUG, "Received SCCRP (result = %d)",
    469                         incoming.sccrq.result);
    470                 log_print(INFO, "Remote server hung up");
    471                 return -REMOTE_REQUESTED;
    472             }
    473             break;
    474 
    475         case OCRP:
    476             if (state == OCRQ && incoming.ocrp.peer == local) {
    477                 if (ESTABLISHED(incoming.ocrp.result)) {
    478                     remote = incoming.ocrp.call;
    479                     log_print(DEBUG, "Received OCRQ (remote = %u)",
    480                             (unsigned)ntohs(remote));
    481                     log_print(INFO, "Session established");
    482                     state = OCRP;
    483 
    484                     if (check_pptp())
    485                         start_pppd_pptp(create_pppox_pptp());
    486                     else
    487                         start_pppd(create_pppox_opns());
    488 
    489                     return 0;
    490                 }
    491                 log_print(DEBUG, "Received OCRP (result = %d)",
    492                         incoming.ocrp.result);
    493                 log_print(INFO, "Remote server hung up");
    494                 return -REMOTE_REQUESTED;
    495             }
    496             break;
    497 
    498         case STOPCCRQ:
    499             log_print(DEBUG, "Received STOPCCRQ");
    500             log_print(INFO, "Remote server hung up");
    501             state = STOPCCRQ;
    502             return -REMOTE_REQUESTED;
    503 
    504         case CCRQ:
    505             /* According to RFC 2637 page 45, we should never receive CCRQ for
    506              * outgoing calls. However, some implementation only acts as PNS and
    507              * always uses CCRQ to clear a call, so here we still handle it. */
    508             if (state == OCRP && incoming.ccrq.call == remote) {
    509                 log_print(DEBUG, "Received CCRQ (remote = %u)",
    510                         (unsigned)ntohs(remote));
    511                 log_print(INFO, "Remote server hung up");
    512                 return -REMOTE_REQUESTED;
    513             }
    514             break;
    515 
    516         case CDN:
    517             if (state == OCRP && incoming.cdn.call == remote) {
    518                 log_print(DEBUG, "Received CDN (remote = %u)",
    519                         (unsigned)ntohs(remote));
    520                 log_print(INFO, "Remote server hung up");
    521                 return -REMOTE_REQUESTED;
    522             }
    523             break;
    524 
    525         case ECHORQ:
    526             log_print(DEBUG, "Received ECHORQ -> Sending ECHORP");
    527             set_message(ECHORP);
    528             outgoing.echorp.identifier = incoming.echorq.identifier;
    529             outgoing.echorp.result = RESULT_OK;
    530             send_packet();
    531             return 0;
    532 
    533         case WEN:
    534         case SLI:
    535             log_print(DEBUG, "Recevied %s", messages[incoming.message]);
    536             return 0;
    537 
    538         case ICRQ:
    539             log_print(DEBUG, "Received ICRQ (remote = %u, call = %u) -> "
    540                     "Sending ICRP with error", (unsigned)ntohs(remote),
    541                     (unsigned)ntohs(incoming.icrq.call));
    542             set_message(ICRP);
    543             outgoing.icrp.peer = incoming.icrq.call;
    544             outgoing.icrp.result = RESULT_ERROR;
    545             send_packet();
    546             return 0;
    547 
    548         case OCRQ:
    549             log_print(DEBUG, "Received OCRQ (remote = %u, call = %u) -> "
    550                     "Sending OCRP with error", (unsigned)ntohs(remote),
    551                     (unsigned)ntohs(incoming.ocrq.call));
    552             set_message(OCRP);
    553             outgoing.ocrp.peer = incoming.ocrq.call;
    554             outgoing.ocrp.result = RESULT_ERROR;
    555             send_packet();
    556             return 0;
    557     }
    558 
    559     /* We reach here if we got an unexpected message. Just log it. */
    560     log_print(DEBUG, "Received UNEXPECTED %s", messages[incoming.message]);
    561     return 0;
    562 }
    563 
    564 static int pptp_timeout()
    565 {
    566     return 0;
    567 }
    568 
    569 static void pptp_shutdown()
    570 {
    571     /* Normally we should send STOPCCRQ and wait for STOPCCRP, but this might
    572      * block for a long time. Here we simply take the shortcut: do nothing. */
    573 }
    574 
    575 struct protocol pptp = {
    576     .name = "pptp",
    577     .arguments = 2,
    578     .usage = "<server> <port>",
    579     .connect = pptp_connect,
    580     .process = pptp_process,
    581     .timeout = pptp_timeout,
    582     .shutdown = pptp_shutdown,
    583 };
    584