Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/boringssl.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Langley <agl@google.com>2015-02-20 02:51:58 +0300
committerAdam Langley <agl@google.com>2015-02-20 22:58:14 +0300
commitbcc4e2304123169af6acd1b842509430e79fd390 (patch)
tree8bf03fb10118c6acb472618662d054de6c0f73f7
parent40f101b78b486d83cd0a7b41cba9a5e09c37dca6 (diff)
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>
-rw-r--r--ssl/d1_both.c158
-rw-r--r--ssl/ssl_locl.h2
2 files changed, 66 insertions, 94 deletions
diff --git a/ssl/d1_both.c b/ssl/d1_both.c
index e97106a7..1390863d 100644
--- a/ssl/d1_both.c
+++ b/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;
diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h
index 9d77c913..39dce5c5 100644
--- a/ssl/ssl_locl.h
+++ b/ssl/ssl_locl.h
@@ -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);