Pass fragment to dtls1_retransmit_message.
We can pass the fragment pointer to dtls1_retransmit_message rather than having it look it up again. Change-Id: If6957428418a44e7ceac91a93f7c6032d331d9d8 Reviewed-on: https://boringssl-review.googlesource.com/3510 Reviewed-by: David Benjamin <davidben@chromium.org> Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
parent
40f101b78b
commit
bcc4e23041
158
ssl/d1_both.c
158
ssl/d1_both.c
@ -933,106 +933,15 @@ int dtls1_get_queue_priority(unsigned short seq, int is_ccs) {
|
||||
return seq * 2 - is_ccs;
|
||||
}
|
||||
|
||||
int dtls1_retransmit_buffered_messages(SSL *s) {
|
||||
pqueue sent = s->d1->sent_messages;
|
||||
piterator iter;
|
||||
pitem *item;
|
||||
hm_fragment *frag;
|
||||
int found = 0;
|
||||
|
||||
iter = pqueue_iterator(sent);
|
||||
|
||||
for (item = pqueue_next(&iter); item != NULL; item = pqueue_next(&iter)) {
|
||||
frag = (hm_fragment *)item->data;
|
||||
if (dtls1_retransmit_message(
|
||||
s, (unsigned short)dtls1_get_queue_priority(
|
||||
frag->msg_header.seq, frag->msg_header.is_ccs),
|
||||
0, &found) <= 0 &&
|
||||
found) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int dtls1_buffer_message(SSL *s, int is_ccs) {
|
||||
pitem *item;
|
||||
hm_fragment *frag;
|
||||
uint8_t seq64be[8];
|
||||
|
||||
/* this function is called immediately after a message has
|
||||
* been serialized */
|
||||
assert(s->init_off == 0);
|
||||
|
||||
frag = dtls1_hm_fragment_new(s->init_num, 0);
|
||||
if (!frag) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(frag->fragment, s->init_buf->data, s->init_num);
|
||||
|
||||
if (is_ccs) {
|
||||
assert(s->d1->w_msg_hdr.msg_len + DTLS1_CCS_HEADER_LENGTH ==
|
||||
(unsigned int)s->init_num);
|
||||
} else {
|
||||
assert(s->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH ==
|
||||
(unsigned int)s->init_num);
|
||||
}
|
||||
|
||||
frag->msg_header.msg_len = s->d1->w_msg_hdr.msg_len;
|
||||
frag->msg_header.seq = s->d1->w_msg_hdr.seq;
|
||||
frag->msg_header.type = s->d1->w_msg_hdr.type;
|
||||
frag->msg_header.frag_off = 0;
|
||||
frag->msg_header.frag_len = s->d1->w_msg_hdr.msg_len;
|
||||
frag->msg_header.is_ccs = is_ccs;
|
||||
frag->msg_header.epoch = s->d1->w_epoch;
|
||||
|
||||
memset(seq64be, 0, sizeof(seq64be));
|
||||
seq64be[6] = (uint8_t)(
|
||||
dtls1_get_queue_priority(frag->msg_header.seq, frag->msg_header.is_ccs) >>
|
||||
8);
|
||||
seq64be[7] = (uint8_t)(
|
||||
dtls1_get_queue_priority(frag->msg_header.seq, frag->msg_header.is_ccs));
|
||||
|
||||
item = pitem_new(seq64be, frag);
|
||||
if (item == NULL) {
|
||||
dtls1_hm_fragment_free(frag);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pqueue_insert(s->d1->sent_messages, item);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off,
|
||||
int *found) {
|
||||
static int dtls1_retransmit_message(SSL *s, hm_fragment *frag) {
|
||||
int ret;
|
||||
/* XDTLS: for now assuming that read/writes are blocking */
|
||||
pitem *item;
|
||||
hm_fragment *frag;
|
||||
unsigned long header_length;
|
||||
uint8_t seq64be[8];
|
||||
uint8_t save_write_sequence[8];
|
||||
|
||||
/* assert(s->init_num == 0);
|
||||
assert(s->init_off == 0); */
|
||||
|
||||
/* XDTLS: the requested message ought to be found, otherwise error */
|
||||
memset(seq64be, 0, sizeof(seq64be));
|
||||
seq64be[6] = (uint8_t)(seq >> 8);
|
||||
seq64be[7] = (uint8_t)seq;
|
||||
|
||||
item = pqueue_find(s->d1->sent_messages, seq64be);
|
||||
if (item == NULL) {
|
||||
assert(0);
|
||||
*found = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*found = 1;
|
||||
frag = (hm_fragment *)item->data;
|
||||
|
||||
if (frag->msg_header.is_ccs) {
|
||||
header_length = DTLS1_CCS_HEADER_LENGTH;
|
||||
} else {
|
||||
@ -1091,6 +1000,71 @@ int dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off,
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int dtls1_retransmit_buffered_messages(SSL *s) {
|
||||
pqueue sent = s->d1->sent_messages;
|
||||
piterator iter = pqueue_iterator(sent);
|
||||
pitem *item;
|
||||
|
||||
for (item = pqueue_next(&iter); item != NULL; item = pqueue_next(&iter)) {
|
||||
hm_fragment *frag = (hm_fragment *)item->data;
|
||||
if (dtls1_retransmit_message(s, frag) <= 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int dtls1_buffer_message(SSL *s, int is_ccs) {
|
||||
pitem *item;
|
||||
hm_fragment *frag;
|
||||
uint8_t seq64be[8];
|
||||
|
||||
/* this function is called immediately after a message has
|
||||
* been serialized */
|
||||
assert(s->init_off == 0);
|
||||
|
||||
frag = dtls1_hm_fragment_new(s->init_num, 0);
|
||||
if (!frag) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(frag->fragment, s->init_buf->data, s->init_num);
|
||||
|
||||
if (is_ccs) {
|
||||
assert(s->d1->w_msg_hdr.msg_len + DTLS1_CCS_HEADER_LENGTH ==
|
||||
(unsigned int)s->init_num);
|
||||
} else {
|
||||
assert(s->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH ==
|
||||
(unsigned int)s->init_num);
|
||||
}
|
||||
|
||||
frag->msg_header.msg_len = s->d1->w_msg_hdr.msg_len;
|
||||
frag->msg_header.seq = s->d1->w_msg_hdr.seq;
|
||||
frag->msg_header.type = s->d1->w_msg_hdr.type;
|
||||
frag->msg_header.frag_off = 0;
|
||||
frag->msg_header.frag_len = s->d1->w_msg_hdr.msg_len;
|
||||
frag->msg_header.is_ccs = is_ccs;
|
||||
frag->msg_header.epoch = s->d1->w_epoch;
|
||||
|
||||
memset(seq64be, 0, sizeof(seq64be));
|
||||
seq64be[6] = (uint8_t)(
|
||||
dtls1_get_queue_priority(frag->msg_header.seq, frag->msg_header.is_ccs) >>
|
||||
8);
|
||||
seq64be[7] = (uint8_t)(
|
||||
dtls1_get_queue_priority(frag->msg_header.seq, frag->msg_header.is_ccs));
|
||||
|
||||
item = pitem_new(seq64be, frag);
|
||||
if (item == NULL) {
|
||||
dtls1_hm_fragment_free(frag);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pqueue_insert(s->d1->sent_messages, item);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* call this function when the buffered messages are no longer needed */
|
||||
void dtls1_clear_record_buffer(SSL *s) {
|
||||
pitem *item;
|
||||
|
@ -809,8 +809,6 @@ int dtls1_send_change_cipher_spec(SSL *s, int a, int b);
|
||||
int dtls1_send_finished(SSL *s, int a, int b, const char *sender, int slen);
|
||||
int dtls1_read_failed(SSL *s, int code);
|
||||
int dtls1_buffer_message(SSL *s, int ccs);
|
||||
int dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off,
|
||||
int *found);
|
||||
int dtls1_get_queue_priority(unsigned short seq, int is_ccs);
|
||||
int dtls1_retransmit_buffered_messages(SSL *s);
|
||||
void dtls1_clear_record_buffer(SSL *s);
|
||||
|
Loading…
Reference in New Issue
Block a user