mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-06 16:40:47 +00:00
libiscsiutil: Change keys_load/save to operate on data buffers.
This will be used in future changes to support large text requests spanning multiple PDUs. Provide wrapper functions keys_load/save_pdu that operate use a PDU's data buffer. Reviewed by: mav Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D33547
This commit is contained in:
parent
2ccb8fde5e
commit
25700db366
|
@ -59,22 +59,22 @@ keys_delete(struct keys *keys)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
keys_load(struct keys *keys, const struct pdu *pdu)
|
keys_load(struct keys *keys, const char *data, size_t len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *keys_data, *name, *pair, *value;
|
char *keys_data, *name, *pair, *value;
|
||||||
size_t pair_len;
|
size_t pair_len;
|
||||||
|
|
||||||
if (pdu->pdu_data_len == 0)
|
if (len == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pdu->pdu_data[pdu->pdu_data_len - 1] != '\0')
|
if (data[len - 1] != '\0')
|
||||||
log_errx(1, "protocol error: key not NULL-terminated\n");
|
log_errx(1, "protocol error: key not NULL-terminated\n");
|
||||||
|
|
||||||
keys_data = malloc(pdu->pdu_data_len);
|
keys_data = malloc(len);
|
||||||
if (keys_data == NULL)
|
if (keys_data == NULL)
|
||||||
log_err(1, "malloc");
|
log_err(1, "malloc");
|
||||||
memcpy(keys_data, pdu->pdu_data, pdu->pdu_data_len);
|
memcpy(keys_data, data, len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX: Review this carefully.
|
* XXX: Review this carefully.
|
||||||
|
@ -96,15 +96,15 @@ keys_load(struct keys *keys, const struct pdu *pdu)
|
||||||
keys->keys_names[i], keys->keys_values[i]);
|
keys->keys_names[i], keys->keys_values[i]);
|
||||||
|
|
||||||
pair += pair_len + 1; /* +1 to skip the terminating '\0'. */
|
pair += pair_len + 1; /* +1 to skip the terminating '\0'. */
|
||||||
if (pair == keys_data + pdu->pdu_data_len)
|
if (pair == keys_data + len)
|
||||||
break;
|
break;
|
||||||
assert(pair < keys_data + pdu->pdu_data_len);
|
assert(pair < keys_data + len);
|
||||||
}
|
}
|
||||||
free(keys_data);
|
free(keys_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
keys_save(struct keys *keys, struct pdu *pdu)
|
keys_save(struct keys *keys, char **datap, size_t *lenp)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
char *data;
|
char *data;
|
||||||
|
@ -131,8 +131,8 @@ keys_save(struct keys *keys, struct pdu *pdu)
|
||||||
data = NULL;
|
data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdu->pdu_data = data;
|
*datap = data;
|
||||||
pdu->pdu_data_len = len;
|
*lenp = len;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
|
|
|
@ -109,14 +109,28 @@ void rchap_delete(struct rchap *rchap);
|
||||||
|
|
||||||
struct keys *keys_new(void);
|
struct keys *keys_new(void);
|
||||||
void keys_delete(struct keys *key);
|
void keys_delete(struct keys *key);
|
||||||
void keys_load(struct keys *keys, const struct pdu *pdu);
|
void keys_load(struct keys *keys, const char *data,
|
||||||
void keys_save(struct keys *keys, struct pdu *pdu);
|
size_t len);
|
||||||
|
void keys_save(struct keys *keys, char **datap,
|
||||||
|
size_t *lenp);
|
||||||
const char *keys_find(struct keys *keys, const char *name);
|
const char *keys_find(struct keys *keys, const char *name);
|
||||||
void keys_add(struct keys *keys,
|
void keys_add(struct keys *keys,
|
||||||
const char *name, const char *value);
|
const char *name, const char *value);
|
||||||
void keys_add_int(struct keys *keys,
|
void keys_add_int(struct keys *keys,
|
||||||
const char *name, int value);
|
const char *name, int value);
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
keys_load_pdu(struct keys *keys, const struct pdu *pdu)
|
||||||
|
{
|
||||||
|
keys_load(keys, pdu->pdu_data, pdu->pdu_data_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
keys_save_pdu(struct keys *keys, struct pdu *pdu)
|
||||||
|
{
|
||||||
|
keys_save(keys, &pdu->pdu_data, &pdu->pdu_data_len);
|
||||||
|
}
|
||||||
|
|
||||||
struct pdu *pdu_new(struct connection *ic);
|
struct pdu *pdu_new(struct connection *ic);
|
||||||
struct pdu *pdu_new_response(struct pdu *request);
|
struct pdu *pdu_new_response(struct pdu *request);
|
||||||
int pdu_ahs_length(const struct pdu *pdu);
|
int pdu_ahs_length(const struct pdu *pdu);
|
||||||
|
|
|
@ -287,7 +287,7 @@ discovery(struct ctld_connection *conn)
|
||||||
log_debugx("beginning discovery session; waiting for Text PDU");
|
log_debugx("beginning discovery session; waiting for Text PDU");
|
||||||
request = text_receive(&conn->conn);
|
request = text_receive(&conn->conn);
|
||||||
request_keys = keys_new();
|
request_keys = keys_new();
|
||||||
keys_load(request_keys, request);
|
keys_load_pdu(request_keys, request);
|
||||||
|
|
||||||
send_targets = keys_find(request_keys, "SendTargets");
|
send_targets = keys_find(request_keys, "SendTargets");
|
||||||
if (send_targets == NULL)
|
if (send_targets == NULL)
|
||||||
|
@ -317,7 +317,7 @@ discovery(struct ctld_connection *conn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
keys_save(response_keys, response);
|
keys_save_pdu(response_keys, response);
|
||||||
|
|
||||||
pdu_send(response);
|
pdu_send(response);
|
||||||
pdu_delete(response);
|
pdu_delete(response);
|
||||||
|
|
|
@ -236,7 +236,7 @@ login_receive_chap_a(struct connection *conn)
|
||||||
|
|
||||||
request = login_receive(conn, false);
|
request = login_receive(conn, false);
|
||||||
request_keys = keys_new();
|
request_keys = keys_new();
|
||||||
keys_load(request_keys, request);
|
keys_load_pdu(request_keys, request);
|
||||||
|
|
||||||
chap_a = keys_find(request_keys, "CHAP_A");
|
chap_a = keys_find(request_keys, "CHAP_A");
|
||||||
if (chap_a == NULL) {
|
if (chap_a == NULL) {
|
||||||
|
@ -270,7 +270,7 @@ login_send_chap_c(struct pdu *request, struct chap *chap)
|
||||||
keys_add(response_keys, "CHAP_C", chap_c);
|
keys_add(response_keys, "CHAP_C", chap_c);
|
||||||
free(chap_i);
|
free(chap_i);
|
||||||
free(chap_c);
|
free(chap_c);
|
||||||
keys_save(response_keys, response);
|
keys_save_pdu(response_keys, response);
|
||||||
pdu_send(response);
|
pdu_send(response);
|
||||||
pdu_delete(response);
|
pdu_delete(response);
|
||||||
keys_delete(response_keys);
|
keys_delete(response_keys);
|
||||||
|
@ -288,7 +288,7 @@ login_receive_chap_r(struct connection *conn, struct auth_group *ag,
|
||||||
|
|
||||||
request = login_receive(conn, false);
|
request = login_receive(conn, false);
|
||||||
request_keys = keys_new();
|
request_keys = keys_new();
|
||||||
keys_load(request_keys, request);
|
keys_load_pdu(request_keys, request);
|
||||||
|
|
||||||
chap_n = keys_find(request_keys, "CHAP_N");
|
chap_n = keys_find(request_keys, "CHAP_N");
|
||||||
if (chap_n == NULL) {
|
if (chap_n == NULL) {
|
||||||
|
@ -352,7 +352,7 @@ login_send_chap_success(struct pdu *request,
|
||||||
* Actually, one more thing: mutual authentication.
|
* Actually, one more thing: mutual authentication.
|
||||||
*/
|
*/
|
||||||
request_keys = keys_new();
|
request_keys = keys_new();
|
||||||
keys_load(request_keys, request);
|
keys_load_pdu(request_keys, request);
|
||||||
chap_i = keys_find(request_keys, "CHAP_I");
|
chap_i = keys_find(request_keys, "CHAP_I");
|
||||||
chap_c = keys_find(request_keys, "CHAP_C");
|
chap_c = keys_find(request_keys, "CHAP_C");
|
||||||
if (chap_i != NULL || chap_c != NULL) {
|
if (chap_i != NULL || chap_c != NULL) {
|
||||||
|
@ -389,7 +389,7 @@ login_send_chap_success(struct pdu *request,
|
||||||
keys_add(response_keys, "CHAP_N", auth->a_mutual_user);
|
keys_add(response_keys, "CHAP_N", auth->a_mutual_user);
|
||||||
keys_add(response_keys, "CHAP_R", chap_r);
|
keys_add(response_keys, "CHAP_R", chap_r);
|
||||||
free(chap_r);
|
free(chap_r);
|
||||||
keys_save(response_keys, response);
|
keys_save_pdu(response_keys, response);
|
||||||
keys_delete(response_keys);
|
keys_delete(response_keys);
|
||||||
} else {
|
} else {
|
||||||
log_debugx("initiator did not request target authentication");
|
log_debugx("initiator did not request target authentication");
|
||||||
|
@ -635,7 +635,7 @@ login_redirect(struct pdu *request, const char *target_address)
|
||||||
response_keys = keys_new();
|
response_keys = keys_new();
|
||||||
keys_add(response_keys, "TargetAddress", target_address);
|
keys_add(response_keys, "TargetAddress", target_address);
|
||||||
|
|
||||||
keys_save(response_keys, response);
|
keys_save_pdu(response_keys, response);
|
||||||
pdu_send(response);
|
pdu_send(response);
|
||||||
pdu_delete(response);
|
pdu_delete(response);
|
||||||
keys_delete(response_keys);
|
keys_delete(response_keys);
|
||||||
|
@ -753,7 +753,7 @@ login_negotiate(struct ctld_connection *conn, struct pdu *request)
|
||||||
}
|
}
|
||||||
|
|
||||||
request_keys = keys_new();
|
request_keys = keys_new();
|
||||||
keys_load(request_keys, request);
|
keys_load_pdu(request_keys, request);
|
||||||
|
|
||||||
response = login_new_response(request);
|
response = login_new_response(request);
|
||||||
bhslr2 = (struct iscsi_bhs_login_response *)response->pdu_bhs;
|
bhslr2 = (struct iscsi_bhs_login_response *)response->pdu_bhs;
|
||||||
|
@ -801,7 +801,7 @@ login_negotiate(struct ctld_connection *conn, struct pdu *request)
|
||||||
log_debugx("operational parameter negotiation done; "
|
log_debugx("operational parameter negotiation done; "
|
||||||
"transitioning to Full Feature Phase");
|
"transitioning to Full Feature Phase");
|
||||||
|
|
||||||
keys_save(response_keys, response);
|
keys_save_pdu(response_keys, response);
|
||||||
pdu_send(response);
|
pdu_send(response);
|
||||||
pdu_delete(response);
|
pdu_delete(response);
|
||||||
keys_delete(response_keys);
|
keys_delete(response_keys);
|
||||||
|
@ -867,7 +867,7 @@ login(struct ctld_connection *conn)
|
||||||
* XXX: Implement the C flag some day.
|
* XXX: Implement the C flag some day.
|
||||||
*/
|
*/
|
||||||
request_keys = keys_new();
|
request_keys = keys_new();
|
||||||
keys_load(request_keys, request);
|
keys_load_pdu(request_keys, request);
|
||||||
|
|
||||||
assert(conn->conn_initiator_name == NULL);
|
assert(conn->conn_initiator_name == NULL);
|
||||||
initiator_name = keys_find(request_keys, "InitiatorName");
|
initiator_name = keys_find(request_keys, "InitiatorName");
|
||||||
|
@ -1036,7 +1036,7 @@ login(struct ctld_connection *conn)
|
||||||
keys_add_int(response_keys,
|
keys_add_int(response_keys,
|
||||||
"TargetPortalGroupTag", pg->pg_tag);
|
"TargetPortalGroupTag", pg->pg_tag);
|
||||||
}
|
}
|
||||||
keys_save(response_keys, response);
|
keys_save_pdu(response_keys, response);
|
||||||
|
|
||||||
pdu_send(response);
|
pdu_send(response);
|
||||||
pdu_delete(response);
|
pdu_delete(response);
|
||||||
|
|
|
@ -177,7 +177,7 @@ discovery(struct iscsid_connection *conn)
|
||||||
request = text_new_request(&conn->conn);
|
request = text_new_request(&conn->conn);
|
||||||
request_keys = keys_new();
|
request_keys = keys_new();
|
||||||
keys_add(request_keys, "SendTargets", "All");
|
keys_add(request_keys, "SendTargets", "All");
|
||||||
keys_save(request_keys, request);
|
keys_save_pdu(request_keys, request);
|
||||||
keys_delete(request_keys);
|
keys_delete(request_keys);
|
||||||
request_keys = NULL;
|
request_keys = NULL;
|
||||||
pdu_send(request);
|
pdu_send(request);
|
||||||
|
@ -187,7 +187,7 @@ discovery(struct iscsid_connection *conn)
|
||||||
log_debugx("waiting for Text Response");
|
log_debugx("waiting for Text Response");
|
||||||
response = text_receive(&conn->conn);
|
response = text_receive(&conn->conn);
|
||||||
response_keys = keys_new();
|
response_keys = keys_new();
|
||||||
keys_load(response_keys, response);
|
keys_load_pdu(response_keys, response);
|
||||||
for (i = 0; i < KEYS_MAX; i++) {
|
for (i = 0; i < KEYS_MAX; i++) {
|
||||||
if (response_keys->keys_names[i] == NULL)
|
if (response_keys->keys_names[i] == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -198,7 +198,7 @@ login_handle_redirection(struct iscsid_connection *conn, struct pdu *response)
|
||||||
assert (bhslr->bhslr_status_class == 1);
|
assert (bhslr->bhslr_status_class == 1);
|
||||||
|
|
||||||
response_keys = keys_new();
|
response_keys = keys_new();
|
||||||
keys_load(response_keys, response);
|
keys_load_pdu(response_keys, response);
|
||||||
|
|
||||||
target_address = keys_find(response_keys, "TargetAddress");
|
target_address = keys_find(response_keys, "TargetAddress");
|
||||||
if (target_address == NULL)
|
if (target_address == NULL)
|
||||||
|
@ -543,7 +543,7 @@ login_negotiate(struct iscsid_connection *conn)
|
||||||
keys_add(request_keys, "DefaultTime2Wait", "0");
|
keys_add(request_keys, "DefaultTime2Wait", "0");
|
||||||
keys_add(request_keys, "DefaultTime2Retain", "0");
|
keys_add(request_keys, "DefaultTime2Retain", "0");
|
||||||
keys_add(request_keys, "ErrorRecoveryLevel", "0");
|
keys_add(request_keys, "ErrorRecoveryLevel", "0");
|
||||||
keys_save(request_keys, request);
|
keys_save_pdu(request_keys, request);
|
||||||
keys_delete(request_keys);
|
keys_delete(request_keys);
|
||||||
request_keys = NULL;
|
request_keys = NULL;
|
||||||
pdu_send(request);
|
pdu_send(request);
|
||||||
|
@ -552,7 +552,7 @@ login_negotiate(struct iscsid_connection *conn)
|
||||||
|
|
||||||
response = login_receive(&conn->conn);
|
response = login_receive(&conn->conn);
|
||||||
response_keys = keys_new();
|
response_keys = keys_new();
|
||||||
keys_load(response_keys, response);
|
keys_load_pdu(response_keys, response);
|
||||||
for (i = 0; i < KEYS_MAX; i++) {
|
for (i = 0; i < KEYS_MAX; i++) {
|
||||||
if (response_keys->keys_names[i] == NULL)
|
if (response_keys->keys_names[i] == NULL)
|
||||||
break;
|
break;
|
||||||
|
@ -607,7 +607,7 @@ login_send_chap_a(struct connection *conn)
|
||||||
request = login_new_request(conn, BHSLR_STAGE_SECURITY_NEGOTIATION);
|
request = login_new_request(conn, BHSLR_STAGE_SECURITY_NEGOTIATION);
|
||||||
request_keys = keys_new();
|
request_keys = keys_new();
|
||||||
keys_add(request_keys, "CHAP_A", "5");
|
keys_add(request_keys, "CHAP_A", "5");
|
||||||
keys_save(request_keys, request);
|
keys_save_pdu(request_keys, request);
|
||||||
keys_delete(request_keys);
|
keys_delete(request_keys);
|
||||||
pdu_send(request);
|
pdu_send(request);
|
||||||
pdu_delete(request);
|
pdu_delete(request);
|
||||||
|
@ -636,7 +636,7 @@ login_send_chap_r(struct pdu *response)
|
||||||
conn = (struct iscsid_connection *)response->pdu_connection;
|
conn = (struct iscsid_connection *)response->pdu_connection;
|
||||||
|
|
||||||
response_keys = keys_new();
|
response_keys = keys_new();
|
||||||
keys_load(response_keys, response);
|
keys_load_pdu(response_keys, response);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First, compute the response.
|
* First, compute the response.
|
||||||
|
@ -693,7 +693,7 @@ login_send_chap_r(struct pdu *response)
|
||||||
free(mutual_chap_c);
|
free(mutual_chap_c);
|
||||||
}
|
}
|
||||||
|
|
||||||
keys_save(request_keys, request);
|
keys_save_pdu(request_keys, request);
|
||||||
keys_delete(request_keys);
|
keys_delete(request_keys);
|
||||||
pdu_send(request);
|
pdu_send(request);
|
||||||
pdu_delete(request);
|
pdu_delete(request);
|
||||||
|
@ -710,7 +710,7 @@ login_verify_mutual(const struct pdu *response)
|
||||||
conn = (struct iscsid_connection *)response->pdu_connection;
|
conn = (struct iscsid_connection *)response->pdu_connection;
|
||||||
|
|
||||||
response_keys = keys_new();
|
response_keys = keys_new();
|
||||||
keys_load(response_keys, response);
|
keys_load_pdu(response_keys, response);
|
||||||
|
|
||||||
chap_n = keys_find(response_keys, "CHAP_N");
|
chap_n = keys_find(response_keys, "CHAP_N");
|
||||||
if (chap_n == NULL)
|
if (chap_n == NULL)
|
||||||
|
@ -816,7 +816,7 @@ login(struct iscsid_connection *conn)
|
||||||
} else {
|
} else {
|
||||||
keys_add(request_keys, "SessionType", "Discovery");
|
keys_add(request_keys, "SessionType", "Discovery");
|
||||||
}
|
}
|
||||||
keys_save(request_keys, request);
|
keys_save_pdu(request_keys, request);
|
||||||
keys_delete(request_keys);
|
keys_delete(request_keys);
|
||||||
pdu_send(request);
|
pdu_send(request);
|
||||||
pdu_delete(request);
|
pdu_delete(request);
|
||||||
|
@ -824,7 +824,7 @@ login(struct iscsid_connection *conn)
|
||||||
response = login_receive(&conn->conn);
|
response = login_receive(&conn->conn);
|
||||||
|
|
||||||
response_keys = keys_new();
|
response_keys = keys_new();
|
||||||
keys_load(response_keys, response);
|
keys_load_pdu(response_keys, response);
|
||||||
|
|
||||||
for (i = 0; i < KEYS_MAX; i++) {
|
for (i = 0; i < KEYS_MAX; i++) {
|
||||||
if (response_keys->keys_names[i] == NULL)
|
if (response_keys->keys_names[i] == NULL)
|
||||||
|
|
Loading…
Reference in a new issue