aboutsummaryrefslogtreecommitdiffstats
path: root/package/ubsec_ssb/src/ubsecvar.h
blob: d218ea31f33cdb35aac640374804df2111d7d868 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .v
/* $Id: $ */

/*
 * Copyright (c) 2008 Daniel Mueller (daniel@danm.de)
 * Copyright (c) 2000 Theo de Raadt
 * Copyright (c) 2001 Patrik Lindergren (patrik@ipunplugged.com)
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Effort sponsored in part by the Defense Advanced Research Projects
 * Agency (DARPA) and Air Force Research Laboratory, Air Force
 * Materiel Command, USAF, under agreement number F30602-01-2-0537.
 *
 */

/* Maximum queue length */
#ifndef UBS_MAX_NQUEUE
#define UBS_MAX_NQUEUE      60
#endif

#define UBS_MAX_SCATTER     64  /* Maximum scatter/gather depth */

#ifndef UBS_MAX_AGGR
#define UBS_MAX_AGGR        5   /* Maximum aggregation count */
#endif

#define UBSEC_CARD(sid)     (((sid) & 0xf0000000) >> 28)
#define UBSEC_SESSION(sid)  ( (sid) & 0x0fffffff)
#define UBSEC_SID(crd, sesn)    (((crd) << 28) | ((sesn) & 0x0fffffff))

#define UBS_DEF_RTY     0xff    /* PCI Retry Timeout */
#define UBS_DEF_TOUT        0xff    /* PCI TRDY Timeout */
#define UBS_DEF_CACHELINE   0x01    /* Cache Line setting */

#define DEFAULT_HMAC_LEN     12

struct ubsec_dma_alloc {
    dma_addr_t      dma_paddr;
    void            *dma_vaddr;
    /*
    bus_dmamap_t            dma_map;
    bus_dma_segment_t       dma_seg;
    */
    size_t          dma_size;
    /*
    int             dma_nseg;
    */
};

struct ubsec_q2 {
    BSD_SIMPLEQ_ENTRY(ubsec_q2)     q_next;
    struct ubsec_dma_alloc      q_mcr;
    struct ubsec_dma_alloc      q_ctx;
    u_int               q_type;
};

struct ubsec_q2_rng {
    struct ubsec_q2         rng_q;
    struct ubsec_dma_alloc      rng_buf;
    int             rng_used;
};

/* C = (M ^ E) mod N */
#define UBS_MODEXP_PAR_M    0
#define UBS_MODEXP_PAR_E    1
#define UBS_MODEXP_PAR_N    2
struct ubsec_q2_modexp {
    struct ubsec_q2         me_q;
    struct cryptkop *       me_krp;
    struct ubsec_dma_alloc      me_M;
    struct ubsec_dma_alloc      me_E;
    struct ubsec_dma_alloc      me_C;
    struct ubsec_dma_alloc      me_epb;
    int             me_modbits;
    int             me_shiftbits;
    int             me_normbits;
};

#define UBS_RSAPRIV_PAR_P   0
#define UBS_RSAPRIV_PAR_Q   1
#define UBS_RSAPRIV_PAR_DP  2
#define UBS_RSAPRIV_PAR_DQ  3
#define UBS_RSAPRIV_PAR_PINV    4
#define UBS_RSAPRIV_PAR_MSGIN   5
#define UBS_RSAPRIV_PAR_MSGOUT  6
struct ubsec_q2_rsapriv {
    struct ubsec_q2         rpr_q;
    struct cryptkop *       rpr_krp;
    struct ubsec_dma_alloc      rpr_msgin;
    struct ubsec_dma_alloc      rpr_msgout;
};

#define UBSEC_RNG_BUFSIZ    16      /* measured in 32bit words */

struct ubsec_dmachunk {
    struct ubsec_mcr    d_mcr;
    struct ubsec_mcr_add    d_mcradd[UBS_MAX_AGGR-1];
    struct ubsec_pktbuf d_sbuf[UBS_MAX_SCATTER-1];
    struct ubsec_pktbuf d_dbuf[UBS_MAX_SCATTER-1];
    u_int32_t       d_macbuf[5];
    union {
        struct ubsec_pktctx_aes256 ctxaes256;
        struct ubsec_pktctx_aes192 ctxaes192;
        struct ubsec_pktctx_des ctxdes;
        struct ubsec_pktctx_aes128 ctxaes128;
        struct ubsec_pktctx     ctx;
    } d_ctx;
};

struct ubsec_dma {
    BSD_SIMPLEQ_ENTRY(ubsec_dma)    d_next;
    struct ubsec_dmachunk       *d_dma;
    struct ubsec_dma_alloc      d_alloc;
};

#define UBS_FLAGS_KEY       0x01        /* has key accelerator */
#define UBS_FLAGS_LONGCTX   0x02        /* uses long ipsec ctx */
#define UBS_FLAGS_BIGKEY    0x04        /* 2048bit keys */
#define UBS_FLAGS_HWNORM    0x08        /* hardware normalization */
#define UBS_FLAGS_RNG       0x10        /* hardware rng */
#define UBS_FLAGS_AES       0x20        /* hardware AES support */

struct ubsec_q {
    BSD_SIMPLEQ_ENTRY(ubsec_q)      q_next;
    int             q_nstacked_mcrs;
    struct ubsec_q          *q_stacked_mcr[UBS_MAX_AGGR-1];
    struct cryptop          *q_crp;
    struct ubsec_dma        *q_dma;

    //struct mbuf           *q_src_m, *q_dst_m;
    struct sk_buff      *q_src_m, *q_dst_m;
    struct uio          *q_src_io, *q_dst_io;

    /*
    bus_dmamap_t            q_src_map;
    bus_dmamap_t            q_dst_map;
    */

    /* DMA addresses for In-/Out packages */
    int q_src_len;
    int q_dst_len;
    struct ubsec_dma_alloc  q_src_map[UBS_MAX_SCATTER];
    struct ubsec_dma_alloc  q_dst_map[UBS_MAX_SCATTER];
    int q_has_dst;

    int             q_sesn;
    int             q_flags;
};

struct ubsec_softc {
    softc_device_decl   sc_dev;
    struct ssb_device   *sdev;      /* device backpointer */

    struct device       *sc_dv;     /* generic device */
    void                *sc_ih;     /* interrupt handler cookie */
    int                 sc_flags;   /* device specific flags */
    u_int32_t           sc_statmask;    /* interrupt status mask */
    int32_t             sc_cid;     /* crypto tag */
    BSD_SIMPLEQ_HEAD(,ubsec_q)  sc_queue;   /* packet queue, mcr1 */
    int                 sc_nqueue;  /* count enqueued, mcr1 */
    BSD_SIMPLEQ_HEAD(,ubsec_q)  sc_qchip;   /* on chip, mcr1 */
    BSD_SIMPLEQ_HEAD(,ubsec_q)  sc_freequeue;   /* list of free queue elements */
    BSD_SIMPLEQ_HEAD(,ubsec_q2) sc_queue2;  /* packet queue, mcr2 */
    int                 sc_nqueue2; /* count enqueued, mcr2 */
    BSD_SIMPLEQ_HEAD(,ubsec_q2) sc_qchip2;  /* on chip, mcr2 */
    int                 sc_nsessions;   /* # of sessions */
    struct ubsec_session        *sc_sessions;   /* sessions */
    int                 sc_rnghz;   /* rng poll time */
    struct ubsec_q2_rng sc_rng;
    struct ubsec_dma    sc_dmaa[UBS_MAX_NQUEUE];
    struct ubsec_q      *sc_queuea[UBS_MAX_NQUEUE];
    BSD_SIMPLEQ_HEAD(,ubsec_q2) sc_q2free;  /* free list */
    spinlock_t          sc_ringmtx; /* PE ring lock */
};

#define UBSEC_QFLAGS_COPYOUTIV      0x1

struct ubsec_session {
    u_int32_t   ses_used;
    u_int32_t   ses_key[8];         /* 3DES/AES key */
    u_int32_t   ses_hminner[5];     /* hmac inner state */
    u_int32_t   ses_hmouter[5];     /* hmac outer state */
    u_int32_t   ses_iv[4];          /* [3]DES/AES iv */
    u_int32_t   ses_keysize;        /* AES key size */
    u_int32_t   ses_mlen;           /* hmac/hash length */
};

struct ubsec_stats {
    u_int64_t hst_ibytes;
    u_int64_t hst_obytes;
    u_int32_t hst_ipackets;
    u_int32_t hst_opackets;
    u_int32_t hst_invalid;
    u_int32_t hst_nomem;
    u_int32_t hst_queuefull;
    u_int32_t hst_dmaerr;
    u_int32_t hst_mcrerr;
    u_int32_t hst_nodmafree;
};

struct ubsec_generic_ctx {
    u_int32_t   pc_key[8];      /* [3]DES/AES key */
    u_int32_t   pc_hminner[5];  /* hmac inner state */
    u_int32_t   pc_hmouter[5];  /* hmac outer state */
    u_int32_t   pc_iv[4];       /* [3]DES/AES iv */
    u_int16_t   pc_flags;       /* flags, below */
    u_int16_t   pc_offset;      /* crypto offset */
    u_int16_t   pc_type;        /* Cryptographic operation */
};