Navigation


source: freeDiameter/libfdcore/cnxctx.h @ 662:2e94ef0515d7

1.1.0-rc1
Last change on this file since 662:2e94ef0515d7 was 662:2e94ef0515d7, checked in by Sebastien Decugis <sdecugis@nict.go.jp>, 11 years ago

Updated copyright information

File size: 6.6 KB
Line 
1/*********************************************************************************************************
2* Software License Agreement (BSD License)                                                               *
3* Author: Sebastien Decugis <sdecugis@nict.go.jp>                                                        *
4*                                                                                                        *
5* Copyright (c) 2011, WIDE Project and NICT                                                              *
6* All rights reserved.                                                                                   *
7*                                                                                                        *
8* Redistribution and use of this software in source and binary forms, with or without modification, are  *
9* permitted provided that the following conditions are met:                                              *
10*                                                                                                        *
11* * Redistributions of source code must retain the above                                                 *
12*   copyright notice, this list of conditions and the                                                    *
13*   following disclaimer.                                                                                *
14*                                                                                                        *
15* * Redistributions in binary form must reproduce the above                                              *
16*   copyright notice, this list of conditions and the                                                    *
17*   following disclaimer in the documentation and/or other                                               *
18*   materials provided with the distribution.                                                            *
19*                                                                                                        *
20* * Neither the name of the WIDE Project or NICT nor the                                                 *
21*   names of its contributors may be used to endorse or                                                  *
22*   promote products derived from this software without                                                  *
23*   specific prior written permission of WIDE Project and                                                *
24*   NICT.                                                                                                *
25*                                                                                                        *
26* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
27* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
28* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
29* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
30* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
31* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
32* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
33* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
34*********************************************************************************************************/
35
36/* This file contains the definitions for internal use in the connection context files */
37
38#ifndef _CNXCTX_H
39#define _CNXCTX_H
40
41/* The connection context structure */
42struct cnxctx {
43        char            cc_id[60];      /* The name of this connection */
44        char            cc_remid[60];   /* Id of remote peer */
45       
46        int             cc_socket;      /* The socket object of the connection -- <=0 if no socket is created */
47
48        int             cc_family;      /* AF_INET or AF_INET6 (mixed) */
49        int             cc_proto;       /* IPPROTO_TCP or IPPROTO_SCTP */
50        uint32_t        cc_status;      /* True if the object is being destroyed: we don't send events anymore */
51        #define         CC_STATUS_CLOSING       1
52        #define         CC_STATUS_ERROR         2
53        #define         CC_STATUS_SIGNALED      4
54        #define         CC_STATUS_TLS           8
55
56        pthread_t       cc_rcvthr;      /* thread for receiving messages on the connection */
57        int             cc_loop;        /* tell the thread if it loops or stops after the first message is received */
58       
59        struct fifo *   cc_incoming;    /* FIFO queue of events received on the connection, FDEVP_CNX_* */
60        struct fifo *   cc_alt;         /* alternate fifo to send FDEVP_CNX_* events to. */
61        #define Target_Queue(cnx)       ((cnx)->cc_alt ?: (cnx)->cc_incoming)
62
63        /* If cc_tls == true */
64        struct {
65                char                            *cn;            /* If not NULL, remote certif will be checked to match this Common Name */
66                int                              mode;          /* GNUTLS_CLIENT / GNUTLS_SERVER */
67                gnutls_session_t                 session;       /* Session object (stream #0 in case of SCTP) */
68        }               cc_tls_para;
69
70        /* If cc_proto == SCTP */
71        struct  {
72                uint16_t str_out;       /* Out streams */
73                uint16_t str_in;        /* In streams */
74                uint16_t pairs;         /* max number of pairs ( = min(in, out)) */
75                uint16_t next;          /* # of stream the next message will be sent to */
76        }               cc_sctp_para;
77
78        /* If both conditions */
79        struct {
80                struct sctps_ctx *array; /* an array of cc_sctp_para.pairs elements -- the #0 is special (session is outside)*/
81                struct sr_store  *sess_store; /* Session data of the master session, to resume the children sessions */
82        }               cc_sctps_data;
83};
84
85void fd_cnx_markerror(struct cnxctx * conn);
86
87/* Socket */
88ssize_t fd_cnx_s_recv(struct cnxctx * conn, void *buffer, size_t length);
89void fd_cnx_s_setto(int sock);
90
91/* TLS */
92int fd_tls_rcvthr_core(struct cnxctx * conn, gnutls_session_t session);
93int fd_tls_prepare(gnutls_session_t * session, int mode, char * priority, void * alt_creds);
94int fd_tls_verify_credentials(gnutls_session_t session, struct cnxctx * conn, int verbose);
95
96/* TCP */
97int fd_tcp_create_bind_server( int * sock, sSA * sa, socklen_t salen );
98int fd_tcp_listen( int sock );
99int fd_tcp_client( int *sock, sSA * sa, socklen_t salen );
100int fd_tcp_get_local_ep(int sock, sSS * ss, socklen_t *sl);
101int fd_tcp_get_remote_ep(int sock, sSS * ss, socklen_t *sl);
102
103#ifndef DISABLE_SCTP
104/* SCTP */
105int fd_sctp_create_bind_server( int * sock, int family, struct fd_list * list, uint16_t port );
106int fd_sctp_listen( int sock );
107int fd_sctp_client( int *sock, int no_ip6, uint16_t port, struct fd_list * list );
108int fd_sctp_get_local_ep(int sock,  struct fd_list * list);
109int fd_sctp_get_remote_ep(int sock, struct fd_list * list);
110int fd_sctp_get_str_info( int sock, uint16_t *in, uint16_t *out, sSS *primary );
111int fd_sctp_sendstr(int sock, uint16_t strid, uint8_t * buf, size_t len, uint32_t * cc_closing);
112int fd_sctp_recvmeta(int sock, uint16_t * strid, uint8_t ** buf, size_t * len, int *event, uint32_t * cc_closing);
113
114/* TLS over SCTP (multi-stream) */
115struct sctps_ctx {
116        struct cnxctx   *parent;        /* for info such as socket, conn name, event list */
117        uint16_t         strid;         /* Stream # of this session */
118        struct fifo     *raw_recv;      /* Raw data received on this stream, for demux */
119        struct {
120                uint8_t *buf;
121                size_t   bufsz;
122                size_t   offset;
123        }                partial;       /* If the pull function did not read the full content of first message in raw, it stores it here for next read call. */
124        pthread_t        thr;           /* Thread to decrypt raw data in this pair of streams */
125        gnutls_session_t session;       /* TLS context using this pair of streams -- except if strid == 0, in that case session is outside the array */
126};
127
128int fd_sctps_init(struct cnxctx * conn);
129int fd_sctps_handshake_others(struct cnxctx * conn, char * priority, void * alt_creds);
130int fd_sctps_startthreads(struct cnxctx * conn, int others);
131void fd_sctps_bye(struct cnxctx * conn);
132void fd_sctps_waitthreadsterm(struct cnxctx * conn);
133void fd_sctps_gnutls_deinit_others(struct cnxctx * conn);
134void fd_sctps_stopthreads(struct cnxctx * conn);
135void fd_sctps_destroy(struct cnxctx * conn);
136
137#endif /* DISABLE_SCTP */
138
139
140#endif /* _CNXCTX_H */
141
Note: See TracBrowser for help on using the repository browser.