PR: 2033
authorDr. Stephen Henson <steve@openssl.org>
Wed, 9 Sep 2009 17:06:13 +0000 (17:06 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Wed, 9 Sep 2009 17:06:13 +0000 (17:06 +0000)
Submitted by: Robin Seggelmann <seggelmann@fh-muenster.de>
Approved by: steve@openssl.org

DTLS listen support.

ssl/d1_lib.c
ssl/d1_srvr.c
ssl/dtls1.h
ssl/ssl.h

index 183717624c3a403e186cfb00d3ea2b6045210a9c..63bfbacc8216fbd1b5c65d9e8ba7c5962cc1a99e 100644 (file)
@@ -68,6 +68,7 @@
 
 static void get_current_time(struct timeval *t);
 const char dtls1_version_str[]="DTLSv1" OPENSSL_VERSION_PTEXT;
+int dtls1_listen(SSL *s, struct sockaddr *client);
 
 SSL3_ENC_METHOD DTLSv1_enc_data={
     dtls1_enc,
@@ -225,6 +226,9 @@ long dtls1_ctrl(SSL *s, int cmd, long larg, void *parg)
        case DTLS_CTRL_HANDLE_TIMEOUT:
                ret = dtls1_handle_timeout(s);
                break;
+       case DTLS_CTRL_LISTEN:
+               ret = dtls1_listen(s, parg);
+               break;
 
        default:
                ret = ssl3_ctrl(s, cmd, larg, parg);
@@ -386,3 +390,17 @@ static void get_current_time(struct timeval *t)
        gettimeofday(t, NULL);
 #endif
 }
+
+int dtls1_listen(SSL *s, struct sockaddr *client)
+       {
+       int ret;
+
+       SSL_set_options(s, SSL_OP_COOKIE_EXCHANGE);
+       s->d1->listen = 1;
+
+       ret = SSL_accept(s);
+       if (ret <= 0) return ret;
+       
+       (void) BIO_dgram_get_peer(SSL_get_rbio(s), client);
+       return 1;
+       }
index 526cc9c74513134993d94f39579ce437b8df2ab6..9098e2eb5ad700fca46fbba4e5e8378d253bad54 100644 (file)
@@ -272,6 +272,15 @@ int dtls1_accept(SSL *s)
                                s->state = SSL3_ST_SW_SRVR_HELLO_A;
 
                        s->init_num=0;
+
+                       /* If we're just listening, stop here */
+                       if (s->d1->listen && s->state == SSL3_ST_SW_SRVR_HELLO_A)
+                               {
+                               ret = 2;
+                               s->d1->listen = 0;
+                               goto end;
+                               }
+                       
                        break;
                        
                case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A:
index 8909dc9ee00407fba03b20466d61f055f38f8c9e..a8ce51ac3e34b2865c5f1d9b2d9bb5526e95cf66 100644 (file)
@@ -214,6 +214,9 @@ typedef struct dtls1_state_st
         */
        record_pqueue buffered_app_data;
 
+       /* Is set when listening for new connections with dtls1_listen() */
+       unsigned int listen;
+
        unsigned int mtu; /* max DTLS packet size */
 
        struct hm_header_st w_msg_hdr;
index 9e2b4394767ebd7afe10d60c03de6a49adca60b2..b60f52be5ed6fa3d73b19af6519e6c1299654c10 100644 (file)
--- a/ssl/ssl.h
+++ b/ssl/ssl.h
@@ -1273,11 +1273,14 @@ size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count);
 
 #define DTLS_CTRL_GET_TIMEOUT          73
 #define DTLS_CTRL_HANDLE_TIMEOUT       74
+#define DTLS_CTRL_LISTEN                       75
 
 #define DTLSv1_get_timeout(ssl, arg) \
        SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg)
 #define DTLSv1_handle_timeout(ssl) \
        SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL)
+#define DTLSv1_listen(ssl, peer) \
+       SSL_ctrl(ssl,DTLS_CTRL_LISTEN,0, (void *)peer)
 
 #define SSL_session_reused(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL)