00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "vfer_datagram.h"
00017 #include "vfer.h"
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 inline int Datagram_Enqueue(frame_list* frames, const void* buffer, int len, int frame_num) {
00032 frame_link* frame_l;
00033 interval_t* interval_ptr;
00034
00035
00036 if (ALLOC(frame_l,frame_link*,frame_link,1) == 0)
00037 return -1;
00038 if (ALLOC(frame_l->frame.data, void*, char, len) == 0) {
00039 RELEASE(frame_l, sizeof(frame_link));
00040 return -1;
00041 }
00042 if (ALLOC(interval_ptr, interval_t*, interval_t, 1) == 0) {
00043 RELEASE(frame_l->frame.data, sizeof(frame_link));
00044 RELEASE(frame_l, sizeof(frame_link));
00045 return -1;
00046 }
00047
00048 if (frames->num == 0)
00049 frames->first = frame_l;
00050 if (frames->last != NULL)
00051 frames->last->next = frame_l;
00052
00053 frames->last = frame_l;
00054 frames->num++;
00055
00056
00057 memcpy(frame_l->frame.data, buffer, len);
00058 frame_l->frame.len = len;
00059 frame_l->frame.urgency = -1;
00060 frame_l->frame.frame_num = frame_num;
00061 frame_l->next = NULL;
00062
00063 frame_l->frame.missing_data.count = 1;
00064 frame_l->frame.missing_data.head = interval_ptr;
00065 interval_ptr->prev = interval_ptr->next = NULL;
00066 interval_ptr->start = 0;
00067 interval_ptr->end = len;
00068
00069 frames->length += len;
00070
00071
00072
00073
00074
00075
00076 return 0;
00077 }
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 inline int Datagram_Dequeue(frame_list* frames, void* buffer, int len) {
00096 int size;
00097 frame_link* frame_l;
00098 frame_l = frames->first;
00099
00100 DEBUG_PRINT(DEBUG_CTL, "datagram.c", "Datagram_Dequeue", "Returning frame[%d] with len[%d] with recvd->len[%d]", frame_l->frame.frame_num, frame_l->frame.len, frames->num);
00101
00102 if (frame_l->frame.len > len) {
00103 return -1;
00104 }
00105
00106
00107 size = frame_l->frame.len;
00108 memcpy (buffer, frame_l->frame.data, size);
00109 frames->length -= size;
00110
00111
00112 Datagram_Remove (frames, NULL, frame_l);
00113 RELEASE(frame_l->frame.data, size);
00114 RELEASE(frame_l, sizeof(frame_link));
00115 return size;
00116 }
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 inline void Datagram_Remove(frame_list* list, frame_link* prev, frame_link* remove) {
00130 if (prev == NULL) {
00131 if (remove != list->first) {
00132 ERROR_PRINT("datagram.c", "Datagram_Remove", "removing from beginning of list but frame is not first");
00133 return;
00134 }
00135 if (remove->next != NULL) {
00136 list->first_frame_num = remove->next->frame.frame_num;
00137 list->first = remove->next;
00138 } else {
00139 list->first = list->last = NULL;
00140 }
00141 } else {
00142 prev->next = remove->next;
00143 if (list->last == remove) {
00144 list->last_frame_num = prev->frame.frame_num;
00145 list->last = prev;
00146 }
00147 }
00148 list->length -= remove->frame.len;
00149 list->num--;
00150 }
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 inline void Datagram_Insert(frame_list* list, frame_link* prev, frame_link* insert) {
00163 if (prev == NULL) {
00164
00165 insert->next = list->first;
00166 list->first = insert;
00167 if (list->last == NULL) {
00168 list->last = insert;
00169 list->last_frame_num = insert->frame.frame_num;;
00170 }
00171 list->first_frame_num = insert->frame.frame_num;
00172 } else {
00173 insert->next = prev->next;
00174 prev->next = insert;
00175 if (list->last == prev) {
00176 list->last_frame_num = insert->frame.frame_num;
00177 list->last = insert;
00178 }
00179 }
00180 list->length += insert->frame.len;
00181 list->num++;
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 inline frame_link* Datagram_Insert_Phantom(frame_list* list, frame_link* prev, int frame_num) {
00198 frame_link* insert;
00199 if (ALLOC(insert,frame_link*,frame_link,1) == 0) return NULL;
00200 insert->frame.len = 0;
00201 insert->frame.frame_num = frame_num;
00202 insert->frame.urgency = -1;
00203 insert->frame.done = 0;
00204 insert->frame.missing_data.head = NULL;
00205 insert->frame.missing_data.count= 0;
00206 Datagram_Insert(list, prev, insert);
00207 return insert;
00208 }
00209
00210
00211
00212
00213
00214
00215
00216 void Datagrams_Print(frame_list* list) {
00217 frame_link* frame_l;
00218 printf("--------------- len[%d]: \n", list->num);
00219 if (list->first != NULL) {
00220 printf("[first] : [%d] %d\n", list->first->frame.frame_num, list->first->frame.len);
00221 }
00222
00223 frame_l = list->first;
00224 while (frame_l != NULL) {
00225 printf("[%d] : %d\n", frame_l->frame.frame_num, frame_l->frame.len);
00226 frame_l = frame_l->next;
00227 }
00228 if (list->last != NULL) {
00229 printf("[last] : [%d] %d\n", list->last->frame.frame_num, list->last->frame.len);
00230 }
00231 printf("---------------\n");
00232 }
00233
00234
00235
00236
00237
00238
00239
00240 inline void Datagrams_Clear(frame_list* list) {
00241 frame_link* frame_l;
00242 frame_link* frame_l2;
00243
00244
00245 frame_l = list->first;
00246 while (frame_l != NULL) {
00247 frame_l2 = frame_l;
00248 frame_l = frame_l->next;
00249 RELEASE(frame_l2->frame.data, frame_l2->frame.len);
00250 RELEASE(frame_l2, sizeof(frame_link));
00251 }
00252 }