Home | History | Annotate | Download | only in tcpdump
      1 /**
      2  * Copyright (c) 2012
      3  *
      4  * Gregory Detal <gregory.detal (at) uclouvain.be>
      5  * Christoph Paasch <christoph.paasch (at) uclouvain.be>
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  *
     18  * 3. Neither the name of the University nor of the Laboratory may be used
     19  *    to endorse or promote products derived from this software without
     20  *    specific prior written permission.
     21  *
     22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32  * SUCH DAMAGE.
     33  */
     34 
     35 #define MPTCP_SUB_CAPABLE       0x0
     36 #define MPTCP_SUB_JOIN          0x1
     37 #define MPTCP_SUB_DSS           0x2
     38 #define MPTCP_SUB_ADD_ADDR      0x3
     39 #define MPTCP_SUB_REMOVE_ADDR   0x4
     40 #define MPTCP_SUB_PRIO          0x5
     41 #define MPTCP_SUB_FAIL          0x6
     42 #define MPTCP_SUB_FCLOSE        0x7
     43 
     44 
     45 struct mptcp_option {
     46         u_int8_t        kind;
     47         u_int8_t        len;
     48         u_int8_t        sub_etc;        /* subtype upper 4 bits, other stuff lower 4 bits */
     49 };
     50 
     51 #define MPTCP_OPT_SUBTYPE(sub_etc)      (((sub_etc) >> 4) & 0xF)
     52 
     53 struct mp_capable {
     54         u_int8_t        kind;
     55         u_int8_t        len;
     56         u_int8_t        sub_ver;
     57         u_int8_t        flags;
     58         u_int8_t        sender_key[8];
     59         u_int8_t        receiver_key[8];
     60 };
     61 
     62 #define MP_CAPABLE_OPT_VERSION(sub_ver) (((sub_ver) >> 0) & 0xF)
     63 #define MP_CAPABLE_C                    0x80
     64 #define MP_CAPABLE_S                    0x01
     65 
     66 struct mp_join {
     67         u_int8_t        kind;
     68         u_int8_t        len;
     69         u_int8_t        sub_b;
     70         u_int8_t        addr_id;
     71         union {
     72                 struct {
     73                         u_int8_t         token[4];
     74                         u_int8_t         nonce[4];
     75                 } syn;
     76                 struct {
     77                         u_int8_t         mac[8];
     78                         u_int8_t         nonce[4];
     79                 } synack;
     80                 struct {
     81                         u_int8_t        mac[20];
     82                 } ack;
     83         } u;
     84 };
     85 
     86 #define MP_JOIN_B                       0x01
     87 
     88 struct mp_dss {
     89         u_int8_t        kind;
     90         u_int8_t        len;
     91         u_int8_t        sub;
     92         u_int8_t        flags;
     93 };
     94 
     95 #define MP_DSS_F                        0x10
     96 #define MP_DSS_m                        0x08
     97 #define MP_DSS_M                        0x04
     98 #define MP_DSS_a                        0x02
     99 #define MP_DSS_A                        0x01
    100 
    101 struct mp_add_addr {
    102         u_int8_t        kind;
    103         u_int8_t        len;
    104         u_int8_t        sub_ipver;
    105         u_int8_t        addr_id;
    106         union {
    107                 struct {
    108                         u_int8_t         addr[4];
    109                         u_int8_t         port[2];
    110                 } v4;
    111                 struct {
    112                         u_int8_t         addr[16];
    113                         u_int8_t         port[2];
    114                 } v6;
    115         } u;
    116 };
    117 
    118 #define MP_ADD_ADDR_IPVER(sub_ipver)    (((sub_ipver) >> 0) & 0xF)
    119 
    120 struct mp_remove_addr {
    121         u_int8_t        kind;
    122         u_int8_t        len;
    123         u_int8_t        sub;
    124         /* list of addr_id */
    125         u_int8_t        addrs_id;
    126 };
    127 
    128 struct mp_fail {
    129         u_int8_t        kind;
    130         u_int8_t        len;
    131         u_int8_t        sub;
    132         u_int8_t        resv;
    133         u_int8_t        data_seq[8];
    134 };
    135 
    136 struct mp_close {
    137         u_int8_t        kind;
    138         u_int8_t        len;
    139         u_int8_t        sub;
    140         u_int8_t        rsv;
    141         u_int8_t        key[8];
    142 };
    143 
    144 struct mp_prio {
    145         u_int8_t        kind;
    146         u_int8_t        len;
    147         u_int8_t        sub_b;
    148         u_int8_t        addr_id;
    149 };
    150 
    151 #define MP_PRIO_B                       0x01
    152