MEDIUM: session: use a specific data_cb for embryonic sessions
We don't want to have the recv or send callbacks in embryonic
sessions, and we want the stream interface to be referenced as
the connection owner only once the session is instanciated. So
let's first have the embryonic session be the owner, then replaced
later by the stream interface once the transport layer is ready.
diff --git a/src/session.c b/src/session.c
index b697599..6209921 100644
--- a/src/session.c
+++ b/src/session.c
@@ -53,6 +53,14 @@
static struct task *expire_mini_session(struct task *t);
int session_complete(struct session *s);
+/* data layer callbacks for an embryonic session */
+struct data_cb sess_conn_cb = {
+ .recv = NULL,
+ .send = NULL,
+ .wake = NULL,
+ .init = NULL,
+};
+
/* This function is called from the protocol layer accept() in order to
* instanciate a new embryonic session on behalf of a given listener and
* frontend. It returns a positive value upon success, 0 if the connection
@@ -165,7 +173,7 @@
* but not initialized. Also note we need to be careful as the stream
* int is not initialized yet.
*/
- si_prepare_conn(&s->si[0], l->proto, l->xprt);
+ conn_prepare(&s->si[0].conn, &sess_conn_cb, l->proto, l->xprt, s);
/* finish initialization of the accepted file descriptor */
fd_insert(cfd);
@@ -260,7 +268,7 @@
*/
int conn_session_complete(struct connection *conn, int flag)
{
- struct session *s = container_of(conn->owner, struct session, si[0]);
+ struct session *s = conn->owner;
if (!(conn->flags & CO_FL_ERROR) && (session_complete(s) > 0)) {
conn->flags &= ~flag;
@@ -305,6 +313,7 @@
/* OK, we're keeping the session, so let's properly initialize the session */
LIST_ADDQ(&sessions, &s->list);
LIST_INIT(&s->back_refs);
+ si_takeover_conn(&s->si[0], l->proto, l->xprt);
s->flags |= SN_INITIALIZED;
s->unique_id = NULL;