Lines Matching defs:c

1 /*	$OpenBSD: connection.c,v 1.25 2025/01/28 20:41:44 claudio Exp $ */
4 * Copyright (c) 2009 Claudio Jeker <claudio@openbsd.org>
57 struct connection *c;
60 if (!(c = calloc(1, sizeof(*c))))
63 c->fd = -1;
64 c->state = CONN_FREE;
65 c->session = s;
66 c->cid = arc4random();
67 c->config = *cc;
68 c->mine = initiator_conn_defaults;
70 c->mine.HeaderDigest = s->config.HeaderDigest;
72 c->mine.DataDigest = s->config.DataDigest;
73 c->his = iscsi_conn_defaults;
75 c->sev.sess = s;
76 c->sev.conn = c;
77 evtimer_set(&c->sev.ev, session_fsm_callback, &c->sev);
79 TAILQ_INIT(&c->pdu_w);
80 TAILQ_INIT(&c->tasks);
81 TAILQ_INSERT_TAIL(&s->connections, c, entry);
83 if (pdu_readbuf_set(&c->prbuf, PDU_READ_SIZE)) {
85 conn_free(c);
90 c->fd = socket(c->config.TargetAddr.ss_family, SOCK_STREAM, 0);
91 if (c->fd == -1) {
93 conn_free(c);
96 if (socket_setblockmode(c->fd, 1)) {
98 conn_free(c);
103 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, &nodelay,
107 event_set(&c->ev, c->fd, EV_READ|EV_PERSIST, conn_dispatch, c);
108 event_set(&c->wev, c->fd, EV_WRITE, conn_write_dispatch, c);
110 conn_fsm(c, CONN_EV_CONNECT);
114 conn_free(struct connection *c)
118 pdu_readbuf_free(&c->prbuf);
119 pdu_free_queue(&c->pdu_w);
121 event_del(&c->sev.ev);
122 event_del(&c->ev);
123 event_del(&c->wev);
124 if (c->fd != -1)
125 close(c->fd);
127 taskq_cleanup(&c->tasks);
129 TAILQ_REMOVE(&c->session->connections, c, entry);
130 free(c);
136 struct connection *c = arg;
143 if ((n = pdu_read(c)) == -1) {
148 conn_fsm(c, CONN_EV_FAIL);
152 conn_fsm(c, CONN_EV_CLOSED);
156 pdu_parse(c);
162 struct connection *c = arg;
172 switch (c->state) {
175 if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR,
178 log_sockaddr(&c->config.TargetAddr));
179 conn_fsm(c, CONN_EV_FAIL);
182 conn_fsm(c, CONN_EV_CONNECTED);
185 if ((n = pdu_write(c)) == -1) {
187 conn_fsm(c, CONN_EV_FAIL);
191 conn_fsm(c, CONN_EV_CLOSED);
196 if (pdu_pending(c))
197 event_add(&c->wev, NULL);
202 conn_fail(struct connection *c)
205 conn_fsm(c, CONN_EV_FAIL);
209 conn_task_ready(struct connection *c)
211 if ((c->state & CONN_RUNNING) && TAILQ_EMPTY(&c->tasks))
217 conn_task_issue(struct connection *c, struct task *t)
219 TAILQ_INSERT_TAIL(&c->tasks, t, entry);
220 conn_task_schedule(c);
224 conn_task_schedule(struct connection *c)
226 struct task *t = TAILQ_FIRST(&c->tasks);
238 conn_pdu_write(c, p);
242 conn_task_cleanup(c, t);
248 conn_task_cleanup(struct connection *c, struct task *t)
253 if (c) {
254 TAILQ_REMOVE(&c->tasks, t, entry);
255 if (!TAILQ_EMPTY(&c->tasks))
256 conn_task_schedule(c);
258 session_schedule(c->session);
299 conn_parse_kvp(struct connection *c, struct kvp *kvp)
302 struct session *s = c->session;
322 SET_NUM(k, c, MaxRecvDataSegmentLength, 512, 16777215);
323 SET_DIGEST(k, c, HeaderDigest);
324 SET_DIGEST(k, c, DataDigest);
389 kvp_set_from_mine(struct kvp *kvp, const char *key, struct connection *c)
407 GET_DIGEST_P(kvp, key, HeaderDigest, c, f);
408 GET_DIGEST_P(kvp, key, DataDigest, c, f);
409 GET_NUM_P(kvp, key, MaxConnections, c->session, f, e);
410 GET_STR_C(kvp, key, TargetName, c->session, f);
411 GET_STR_C(kvp, key, InitiatorName, c->session, f);
412 GET_BOOL_P(kvp, key, InitialR2T, c->session, f);
413 GET_BOOL_P(kvp, key, ImmediateData, c->session, f);
414 GET_NUM_P(kvp, key, MaxRecvDataSegmentLength, c, f, e);
415 GET_NUM_P(kvp, key, MaxBurstLength, c->session, f, e);
416 GET_NUM_P(kvp, key, FirstBurstLength, c->session, f, e);
417 GET_NUM_P(kvp, key, DefaultTime2Wait, c->session, f, e);
418 GET_NUM_P(kvp, key, DefaultTime2Retain, c->session, f, e);
419 GET_NUM_P(kvp, key, MaxOutstandingR2T, c->session, f, e);
420 GET_BOOL_P(kvp, key, DataPDUInOrder, c->session, f);
421 GET_BOOL_P(kvp, key, DataSequenceInOrder, c->session, f);
422 GET_NUM_P(kvp, key, ErrorRecoveryLevel, c->session, f, e);
423 GET_STYPE_C(kvp, key, SessionType, c->session, f);
441 conn_pdu_write(struct connection *c, struct pdu *p)
456 ipdu->expstatsn = ntohl(c->expstatsn);
460 TAILQ_INSERT_TAIL(&c->pdu_w, p, entry);
461 event_add(&c->wev, NULL);
492 conn_fsm(struct connection *c, enum c_event event)
497 if (c->state & fsm[i].state && event == fsm[i].event) {
499 c->session->config.SessionName,
500 conn_state(c->state), conn_event(event));
501 ns = fsm[i].action(c, event);
506 c->session->config.SessionName, conn_state(ns));
507 c->state = ns;
512 c->session->config.SessionName, conn_state(c->state),
518 c_do_connect(struct connection *c, enum c_event ev)
520 if (c->fd == -1) {
522 log_sockaddr(&c->config.TargetAddr));
523 session_fsm(&c->sev, SESS_EV_CONN_FAIL, 0);
526 if (c->config.LocalAddr.ss_len != 0) {
527 if (bind(c->fd, (struct sockaddr *)&c->config.LocalAddr,
528 c->config.LocalAddr.ss_len) == -1) {
530 log_sockaddr(&c->config.LocalAddr));
531 session_fsm(&c->sev, SESS_EV_CONN_FAIL, 0);
535 if (connect(c->fd, (struct sockaddr *)&c->config.TargetAddr,
536 c->config.TargetAddr.ss_len) == -1) {
538 event_add(&c->wev, NULL);
539 event_add(&c->ev, NULL);
543 log_sockaddr(&c->config.TargetAddr));
544 session_fsm(&c->sev, SESS_EV_CONN_FAIL, 0);
548 event_add(&c->ev, NULL);
550 return c_do_login(c, CONN_EV_CONNECTED);
554 c_do_login(struct connection *c, enum c_event ev)
557 initiator_login(c);
562 c_do_loggedin(struct connection *c, enum c_event ev)
564 iscsi_merge_conn_params(&c->active, &c->mine, &c->his);
565 session_fsm(&c->sev, SESS_EV_CONN_LOGGED_IN, 0);
571 c_do_req_logout(struct connection *c, enum c_event ev)
575 if (c->state & CONN_IN_LOGOUT)
582 c_do_logout(struct connection *c, enum c_event ev)
589 c_do_loggedout(struct connection *c, enum c_event ev)
599 c_do_fail(struct connection *c, enum c_event ev)
604 event_del(&c->ev);
605 event_del(&c->wev);
606 close(c->fd);
607 c->fd = -1; /* make sure this fd is not closed again */
610 taskq_cleanup(&c->tasks);
613 session_fsm(&c->sev, SESS_EV_CONN_FAIL, 0);
615 if (ev == CONN_EV_FREE || c->state & CONN_NEVER_LOGGED_IN)
621 c_do_cleanup(struct connection *c, enum c_event ev)