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
|
||||
keys_load(struct keys *keys, const struct pdu *pdu)
|
||||
keys_load(struct keys *keys, const char *data, size_t len)
|
||||
{
|
||||
int i;
|
||||
char *keys_data, *name, *pair, *value;
|
||||
size_t pair_len;
|
||||
|
||||
if (pdu->pdu_data_len == 0)
|
||||
if (len == 0)
|
||||
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");
|
||||
|
||||
keys_data = malloc(pdu->pdu_data_len);
|
||||
keys_data = malloc(len);
|
||||
if (keys_data == NULL)
|
||||
log_err(1, "malloc");
|
||||
memcpy(keys_data, pdu->pdu_data, pdu->pdu_data_len);
|
||||
memcpy(keys_data, data, len);
|
||||
|
||||
/*
|
||||
* 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]);
|
||||
|
||||
pair += pair_len + 1; /* +1 to skip the terminating '\0'. */
|
||||
if (pair == keys_data + pdu->pdu_data_len)
|
||||
if (pair == keys_data + len)
|
||||
break;
|
||||
assert(pair < keys_data + pdu->pdu_data_len);
|
||||
assert(pair < keys_data + len);
|
||||
}
|
||||
free(keys_data);
|
||||
}
|
||||
|
||||
void
|
||||
keys_save(struct keys *keys, struct pdu *pdu)
|
||||
keys_save(struct keys *keys, char **datap, size_t *lenp)
|
||||
{
|
||||
FILE *fp;
|
||||
char *data;
|
||||
@ -131,8 +131,8 @@ keys_save(struct keys *keys, struct pdu *pdu)
|
||||
data = NULL;
|
||||
}
|
||||
|
||||
pdu->pdu_data = data;
|
||||
pdu->pdu_data_len = len;
|
||||
*datap = data;
|
||||
*lenp = len;
|
||||
}
|
||||
|
||||
const char *
|
||||
|
@ -109,14 +109,28 @@ void rchap_delete(struct rchap *rchap);
|
||||
|
||||
struct keys *keys_new(void);
|
||||
void keys_delete(struct keys *key);
|
||||
void keys_load(struct keys *keys, const struct pdu *pdu);
|
||||
void keys_save(struct keys *keys, struct pdu *pdu);
|
||||
void keys_load(struct keys *keys, const char *data,
|
||||
size_t len);
|
||||
void keys_save(struct keys *keys, char **datap,
|
||||
size_t *lenp);
|
||||
const char *keys_find(struct keys *keys, const char *name);
|
||||
void keys_add(struct keys *keys,
|
||||
const char *name, const char *value);
|
||||
void keys_add_int(struct keys *keys,
|
||||
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_response(struct pdu *request);
|
||||
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");
|
||||
request = text_receive(&conn->conn);
|
||||
request_keys = keys_new();
|
||||
keys_load(request_keys, request);
|
||||
keys_load_pdu(request_keys, request);
|
||||
|
||||
send_targets = keys_find(request_keys, "SendTargets");
|
||||
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_delete(response);
|
||||
|
@ -236,7 +236,7 @@ login_receive_chap_a(struct connection *conn)
|
||||
|
||||
request = login_receive(conn, false);
|
||||
request_keys = keys_new();
|
||||
keys_load(request_keys, request);
|
||||
keys_load_pdu(request_keys, request);
|
||||
|
||||
chap_a = keys_find(request_keys, "CHAP_A");
|
||||
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);
|
||||
free(chap_i);
|
||||
free(chap_c);
|
||||
keys_save(response_keys, response);
|
||||
keys_save_pdu(response_keys, response);
|
||||
pdu_send(response);
|
||||
pdu_delete(response);
|
||||
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_keys = keys_new();
|
||||
keys_load(request_keys, request);
|
||||
keys_load_pdu(request_keys, request);
|
||||
|
||||
chap_n = keys_find(request_keys, "CHAP_N");
|
||||
if (chap_n == NULL) {
|
||||
@ -352,7 +352,7 @@ login_send_chap_success(struct pdu *request,
|
||||
* Actually, one more thing: mutual authentication.
|
||||
*/
|
||||
request_keys = keys_new();
|
||||
keys_load(request_keys, request);
|
||||
keys_load_pdu(request_keys, request);
|
||||
chap_i = keys_find(request_keys, "CHAP_I");
|
||||
chap_c = keys_find(request_keys, "CHAP_C");
|
||||
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_R", chap_r);
|
||||
free(chap_r);
|
||||
keys_save(response_keys, response);
|
||||
keys_save_pdu(response_keys, response);
|
||||
keys_delete(response_keys);
|
||||
} else {
|
||||
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();
|
||||
keys_add(response_keys, "TargetAddress", target_address);
|
||||
|
||||
keys_save(response_keys, response);
|
||||
keys_save_pdu(response_keys, response);
|
||||
pdu_send(response);
|
||||
pdu_delete(response);
|
||||
keys_delete(response_keys);
|
||||
@ -753,7 +753,7 @@ login_negotiate(struct ctld_connection *conn, struct pdu *request)
|
||||
}
|
||||
|
||||
request_keys = keys_new();
|
||||
keys_load(request_keys, request);
|
||||
keys_load_pdu(request_keys, request);
|
||||
|
||||
response = login_new_response(request);
|
||||
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; "
|
||||
"transitioning to Full Feature Phase");
|
||||
|
||||
keys_save(response_keys, response);
|
||||
keys_save_pdu(response_keys, response);
|
||||
pdu_send(response);
|
||||
pdu_delete(response);
|
||||
keys_delete(response_keys);
|
||||
@ -867,7 +867,7 @@ login(struct ctld_connection *conn)
|
||||
* XXX: Implement the C flag some day.
|
||||
*/
|
||||
request_keys = keys_new();
|
||||
keys_load(request_keys, request);
|
||||
keys_load_pdu(request_keys, request);
|
||||
|
||||
assert(conn->conn_initiator_name == NULL);
|
||||
initiator_name = keys_find(request_keys, "InitiatorName");
|
||||
@ -1036,7 +1036,7 @@ login(struct ctld_connection *conn)
|
||||
keys_add_int(response_keys,
|
||||
"TargetPortalGroupTag", pg->pg_tag);
|
||||
}
|
||||
keys_save(response_keys, response);
|
||||
keys_save_pdu(response_keys, response);
|
||||
|
||||
pdu_send(response);
|
||||
pdu_delete(response);
|
||||
|
@ -177,7 +177,7 @@ discovery(struct iscsid_connection *conn)
|
||||
request = text_new_request(&conn->conn);
|
||||
request_keys = keys_new();
|
||||
keys_add(request_keys, "SendTargets", "All");
|
||||
keys_save(request_keys, request);
|
||||
keys_save_pdu(request_keys, request);
|
||||
keys_delete(request_keys);
|
||||
request_keys = NULL;
|
||||
pdu_send(request);
|
||||
@ -187,7 +187,7 @@ discovery(struct iscsid_connection *conn)
|
||||
log_debugx("waiting for Text Response");
|
||||
response = text_receive(&conn->conn);
|
||||
response_keys = keys_new();
|
||||
keys_load(response_keys, response);
|
||||
keys_load_pdu(response_keys, response);
|
||||
for (i = 0; i < KEYS_MAX; i++) {
|
||||
if (response_keys->keys_names[i] == NULL)
|
||||
break;
|
||||
|
@ -198,7 +198,7 @@ login_handle_redirection(struct iscsid_connection *conn, struct pdu *response)
|
||||
assert (bhslr->bhslr_status_class == 1);
|
||||
|
||||
response_keys = keys_new();
|
||||
keys_load(response_keys, response);
|
||||
keys_load_pdu(response_keys, response);
|
||||
|
||||
target_address = keys_find(response_keys, "TargetAddress");
|
||||
if (target_address == NULL)
|
||||
@ -543,7 +543,7 @@ login_negotiate(struct iscsid_connection *conn)
|
||||
keys_add(request_keys, "DefaultTime2Wait", "0");
|
||||
keys_add(request_keys, "DefaultTime2Retain", "0");
|
||||
keys_add(request_keys, "ErrorRecoveryLevel", "0");
|
||||
keys_save(request_keys, request);
|
||||
keys_save_pdu(request_keys, request);
|
||||
keys_delete(request_keys);
|
||||
request_keys = NULL;
|
||||
pdu_send(request);
|
||||
@ -552,7 +552,7 @@ login_negotiate(struct iscsid_connection *conn)
|
||||
|
||||
response = login_receive(&conn->conn);
|
||||
response_keys = keys_new();
|
||||
keys_load(response_keys, response);
|
||||
keys_load_pdu(response_keys, response);
|
||||
for (i = 0; i < KEYS_MAX; i++) {
|
||||
if (response_keys->keys_names[i] == NULL)
|
||||
break;
|
||||
@ -607,7 +607,7 @@ login_send_chap_a(struct connection *conn)
|
||||
request = login_new_request(conn, BHSLR_STAGE_SECURITY_NEGOTIATION);
|
||||
request_keys = keys_new();
|
||||
keys_add(request_keys, "CHAP_A", "5");
|
||||
keys_save(request_keys, request);
|
||||
keys_save_pdu(request_keys, request);
|
||||
keys_delete(request_keys);
|
||||
pdu_send(request);
|
||||
pdu_delete(request);
|
||||
@ -636,7 +636,7 @@ login_send_chap_r(struct pdu *response)
|
||||
conn = (struct iscsid_connection *)response->pdu_connection;
|
||||
|
||||
response_keys = keys_new();
|
||||
keys_load(response_keys, response);
|
||||
keys_load_pdu(response_keys, response);
|
||||
|
||||
/*
|
||||
* First, compute the response.
|
||||
@ -693,7 +693,7 @@ login_send_chap_r(struct pdu *response)
|
||||
free(mutual_chap_c);
|
||||
}
|
||||
|
||||
keys_save(request_keys, request);
|
||||
keys_save_pdu(request_keys, request);
|
||||
keys_delete(request_keys);
|
||||
pdu_send(request);
|
||||
pdu_delete(request);
|
||||
@ -710,7 +710,7 @@ login_verify_mutual(const struct pdu *response)
|
||||
conn = (struct iscsid_connection *)response->pdu_connection;
|
||||
|
||||
response_keys = keys_new();
|
||||
keys_load(response_keys, response);
|
||||
keys_load_pdu(response_keys, response);
|
||||
|
||||
chap_n = keys_find(response_keys, "CHAP_N");
|
||||
if (chap_n == NULL)
|
||||
@ -816,7 +816,7 @@ login(struct iscsid_connection *conn)
|
||||
} else {
|
||||
keys_add(request_keys, "SessionType", "Discovery");
|
||||
}
|
||||
keys_save(request_keys, request);
|
||||
keys_save_pdu(request_keys, request);
|
||||
keys_delete(request_keys);
|
||||
pdu_send(request);
|
||||
pdu_delete(request);
|
||||
@ -824,7 +824,7 @@ login(struct iscsid_connection *conn)
|
||||
response = login_receive(&conn->conn);
|
||||
|
||||
response_keys = keys_new();
|
||||
keys_load(response_keys, response);
|
||||
keys_load_pdu(response_keys, response);
|
||||
|
||||
for (i = 0; i < KEYS_MAX; i++) {
|
||||
if (response_keys->keys_names[i] == NULL)
|
||||
|
Loading…
x
Reference in New Issue
Block a user