int proto_expectation_add(struct proto_expectation *e, struct conntrack_session *session, unsigned int expiry, ptime now) { if (!e || !e->tail || !e->tail->proto) { pomlog(POMLOG_ERR "Cannot add expectation as it's incomplete"); return POM_ERR; } e->expiry = timer_alloc(e, proto_expectation_expiry); if (!e->expiry) return POM_ERR; if (timer_queue_now(e->expiry, expiry, now) != POM_OK) return POM_ERR; conntrack_session_refcount_inc(session); e->session = session; struct proto *proto = e->tail->proto; pom_rwlock_wlock(&proto->expectation_lock); e->next = proto->expectations; if (e->next) e->next->prev = e; proto->expectations = e; pom_rwlock_unlock(&proto->expectation_lock); registry_perf_inc(e->proto->perf_expt_pending, 1); return POM_OK; }
int conntrack_session_bind(struct conntrack_entry *ce, struct conntrack_session *session) { if (ce->session) { pomlog(POMLOG_WARN "Warning, session already exists when trying to bind another session. TODO: implement merging"); conntrack_session_refcount_dec(ce->session); } conntrack_session_refcount_inc(session); ce->session = session; return POM_OK; }
void proto_expectation_set_session(struct proto_expectation *e, struct conntrack_session *session) { conntrack_session_refcount_inc(session); e->session = session; }