MINOR: session: introduce session_new()

This one creates a new session and does the minimum initialization.
diff --git a/include/proto/session.h b/include/proto/session.h
index 3f008e1..cb4deec 100644
--- a/include/proto/session.h
+++ b/include/proto/session.h
@@ -33,6 +33,7 @@
 #include <proto/stick_table.h>
 
 extern struct pool_head *pool2_session;
+struct session *session_new(struct proxy *fe, struct listener *li, enum obj_type *origin);
 void session_free(struct session *sess);
 int init_session();
 int session_accept_fd(struct listener *l, int cfd, struct sockaddr_storage *addr);
diff --git a/src/session.c b/src/session.c
index 070c340..5580d4f 100644
--- a/src/session.c
+++ b/src/session.c
@@ -42,6 +42,27 @@
 	.init = conn_complete_session,
 };
 
+/* Create a a new session and assign it to frontend <fe>, listener <li>,
+ * origin <origin>, set the current date and clear the stick counters pointers.
+ * Returns the session upon success or NULL. The session may be released using
+ * session_free().
+ */
+struct session *session_new(struct proxy *fe, struct listener *li, enum obj_type *origin)
+{
+	struct session *sess;
+
+	sess = pool_alloc2(pool2_session);
+	if (sess) {
+		sess->listener = li;
+		sess->fe = fe;
+		sess->origin = origin;
+		sess->accept_date = date; /* user-visible date for logging */
+		sess->tv_accept   = now;  /* corrected date for internal use */
+		memset(sess->stkctr, 0, sizeof(sess->stkctr));
+	}
+	return sess;
+}
+
 void session_free(struct session *sess)
 {
 	session_store_counters(sess);