summaryrefslogtreecommitdiffstats
path: root/src/net/tls.c
diff options
context:
space:
mode:
authorMichael Brown2012-06-09 19:58:54 +0200
committerMichael Brown2012-06-09 19:59:41 +0200
commitaf47789ef2276fdb3b081955025b778d16ed2188 (patch)
treeca82a352f68cc65024ff73d657c956cf13e2d878 /src/net/tls.c
parent[tcp] Mark any unacknowledged transmission as a pending operation (diff)
downloadipxe-af47789ef2276fdb3b081955025b778d16ed2188.tar.gz
ipxe-af47789ef2276fdb3b081955025b778d16ed2188.tar.xz
ipxe-af47789ef2276fdb3b081955025b778d16ed2188.zip
[tls] Mark security negotiation as a pending operation
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/tls.c')
-rw-r--r--src/net/tls.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/net/tls.c b/src/net/tls.c
index 97e013d7..8d6620d3 100644
--- a/src/net/tls.c
+++ b/src/net/tls.c
@@ -31,6 +31,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <time.h>
#include <errno.h>
#include <byteswap.h>
+#include <ipxe/pending.h>
#include <ipxe/hmac.h>
#include <ipxe/md5.h>
#include <ipxe/sha1.h>
@@ -101,7 +102,8 @@ static void tls_set_uint24 ( uint8_t field24[3], unsigned long value ) {
* @ret is_ready TLS session is ready
*/
static int tls_ready ( struct tls_session *tls ) {
- return ( tls->client_finished && tls->server_finished );
+ return ( ( ! is_pending ( &tls->client_negotiation ) ) &&
+ ( ! is_pending ( &tls->server_negotiation ) ) );
}
/******************************************************************************
@@ -205,6 +207,10 @@ static void free_tls ( struct refcnt *refcnt ) {
*/
static void tls_close ( struct tls_session *tls, int rc ) {
+ /* Remove pending operations, if applicable */
+ pending_put ( &tls->client_negotiation );
+ pending_put ( &tls->server_negotiation );
+
/* Remove process */
process_del ( &tls->process );
@@ -1141,7 +1147,7 @@ static int tls_send_finished ( struct tls_session *tls ) {
return rc;
/* Mark client as finished */
- tls->client_finished = 1;
+ pending_put ( &tls->client_negotiation );
return 0;
}
@@ -1489,7 +1495,7 @@ static int tls_new_finished ( struct tls_session *tls,
}
/* Mark server as finished */
- tls->server_finished = 1;
+ pending_put ( &tls->server_negotiation );
/* Send notification of a window change */
xfer_window_changed ( &tls->plainstream );
@@ -2396,6 +2402,10 @@ int add_tls ( struct interface *xfer, const char *name,
tls->handshake_ctx = tls->handshake_sha256_ctx;
tls->tx_pending = TLS_TX_CLIENT_HELLO;
+ /* Add pending operations for server and client Finished messages */
+ pending_get ( &tls->client_negotiation );
+ pending_get ( &tls->server_negotiation );
+
/* Attach to parent interface, mortalise self, and return */
intf_plug_plug ( &tls->plainstream, xfer );
*next = &tls->cipherstream;