- Added simple SSL session cache implementation
 - Revamped session resumption handling

diff --git a/include/polarssl/ssl.h b/include/polarssl/ssl.h
index dc2619a..fcf8a8f 100644
--- a/include/polarssl/ssl.h
+++ b/include/polarssl/ssl.h
@@ -284,7 +284,7 @@
 typedef struct _ssl_handshake_params ssl_handshake_params;
 
 /*
- * This structure is used for session resuming.
+ * This structure is used for storing current session data.
  */
 struct _ssl_session
 {
@@ -295,7 +295,6 @@
     unsigned char id[32];       /*!< session identifier */
     unsigned char master[48];   /*!< the master secret  */
     x509_cert *peer_cert;       /*!< peer X.509 cert chain */
-    ssl_session *next;          /*!< next session entry */
 };
 
 /*
@@ -362,6 +361,8 @@
 
     unsigned char randbytes[64];        /*!<  random bytes            */
     unsigned char premaster[256];       /*!<  premaster secret        */
+
+    int resume;                         /*!<  session resume indicator*/
 };
 
 struct _ssl_context
@@ -386,24 +387,24 @@
     int (*f_recv)(void *, unsigned char *, size_t);
     int (*f_send)(void *, const unsigned char *, size_t);
     int (*f_vrfy)(void *, x509_cert *, int, int);
+    int (*f_get_cache)(void *, ssl_session *);
+    int (*f_set_cache)(void *, const ssl_session *);
 
     void *p_rng;                /*!< context for the RNG function     */
     void *p_dbg;                /*!< context for the debug function   */
     void *p_recv;               /*!< context for reading operations   */
     void *p_send;               /*!< context for writing operations   */
-    void *p_vrfy;               /*!< context for verification */
+    void *p_vrfy;               /*!< context for verification         */
+    void *p_get_cache;          /*!< context for cache retrieval      */
+    void *p_set_cache;          /*!< context for cache store          */
 
     /*
      * Session layer
      */
-    int resume;                         /*!<  session resuming flag   */
-    int timeout;                        /*!<  sess. expiration time   */
     ssl_session *session_in;            /*!<  current session data (in)   */
     ssl_session *session_out;           /*!<  current session data (out)  */
     ssl_session *session;               /*!<  negotiated session data     */
     ssl_session *session_negotiate;     /*!<  session data in negotiation */
-    int (*s_get)(ssl_context *);        /*!<  (server) get callback   */
-    int (*s_set)(ssl_context *);        /*!<  (server) set callback   */
 
     ssl_handshake_params *handshake;    /*!<  params required only during
                                               the handshake process        */
@@ -636,26 +637,59 @@
         int (*f_send)(void *, const unsigned char *, size_t), void *p_send );
 
 /**
- * \brief          Set the session callbacks (server-side only)
+ * \brief          Set the session cache callbacks (server-side only)
+ *                 If not set, no session resuming is done.
  *
- * \param ssl      SSL context
- * \param s_get    session get callback
- * \param s_set    session set callback
+ *                 The session cache has the responsibility to check for stale
+ *                 entries based on timeout. See RFC 5246 for recommendations.
+ *
+ *                 Warning: session.peer_cert is cleared by the SSL/TLS layer on
+ *                 connection shutdown, so do not cache the pointer! Either set
+ *                 it to NULL or make a full copy of the certificate.
+ *
+ *                 The get callback is called once during the initial handshake
+ *                 to enable session resuming. The get function has the
+ *                 following parameters: (void *parameter, ssl_session *session)
+ *                 If a valid entry is found, it should fill the master of
+ *                 the session object with the cached values and return 0,
+ *                 return 1 otherwise. Optionally peer_cert can be set as well
+ *                 if it is properly present in cache entry.
+ *
+ *                 The set callback is called once during the initial handshake
+ *                 to enable session resuming after the entire handshake has
+ *                 been finished. The set function has the following parameters:
+ *                 (void *parameter, const ssl_session *session). The function
+ *                 should create a cache entry for future retrieval based on
+ *                 the data in the session structure and should keep in mind
+ *                 that the ssl_session object presented (and all its referenced
+ *                 data) is cleared by the SSL/TLS layer when the connection is
+ *                 terminated. It is recommended to add metadata to determine if
+ *                 an entry is still valid in the future. Return 0 if
+ *                 successfully cached, return 0 otherwise.
+ *
+ * \param ssl            SSL context
+ * \param f_get_cache    session get callback
+ * \param p_get_cache    session get parameter
+ * \param f_set_cache    session set callback
+ * \param p_set_cache    session set parameter
  */
-void ssl_set_scb( ssl_context *ssl,
-                  int (*s_get)(ssl_context *),
-                  int (*s_set)(ssl_context *) );
+void ssl_set_session_cache( ssl_context *ssl,
+        int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
+        int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache );
 
 /**
- * \brief          Set the session resuming flag, timeout and data
+ * \brief          Request resumption of session (client-side only)
+ *                 Session data is copied from presented session structure.
+ *
+ *                 Warning: session.peer_cert is cleared by the SSL/TLS layer on
+ *                 connection shutdown, so do not cache the pointer! Either set
+ *                 it to NULL or make a full copy of the certificate when
+ *                 storing the session for use in this function.
  *
  * \param ssl      SSL context
- * \param resume   if 0 (default), the session will not be resumed
- * \param timeout  session timeout in seconds, or 0 (no timeout)
  * \param session  session context
  */
-void ssl_set_session( ssl_context *ssl, int resume, int timeout,
-                      ssl_session *session );
+void ssl_set_session( ssl_context *ssl, const ssl_session *session );
 
 /**
  * \brief               Set the list of allowed ciphersuites
@@ -900,8 +934,8 @@
 void ssl_free( ssl_context *ssl );
 
 /**
- * \brief          Free referenced items in an SSL session and free all
- *                 sessions in the chain. Memory is cleared
+ * \brief          Free referenced items in an SSL session including the
+ *                 peer certificate and clear memory
  *
  * \param session  SSL session
  */