PDP10, PDP11, VAX: Fix DMC/DMR DDCMP implementation to not crash due to buffer exhaustion while generating NAK packets for missing packets.

This commit is contained in:
Mark Pizzolato 2014-05-30 11:30:07 -07:00
parent 963ff98da4
commit 779e2437bd
2 changed files with 7 additions and 2 deletions

View file

@ -211,7 +211,7 @@ r = rand();
rmax = (double)RAND_MAX; rmax = (double)RAND_MAX;
#endif #endif
if (msg[0] == DDCMP_ENQ) { if (msg[0] == DDCMP_ENQ) {
int eat = 0 + (int) (2000.0 * (r / rmax)); int eat = 0 + (int) (2000.0 * (r / (rmax + 1.0)));
if (eat <= (trollHungerLevel * 2)) { /* Hungry? */ if (eat <= (trollHungerLevel * 2)) { /* Hungry? */
if (eat <= trollHungerLevel) { /* Eat the packet */ if (eat <= trollHungerLevel) { /* Eat the packet */
@ -225,7 +225,7 @@ if (msg[0] == DDCMP_ENQ) {
} }
} }
else { else {
int eat = 0 + (int) (3000.0 * (r / rmax)); int eat = 0 + (int) (3000.0 * (r / (rmax + 1.0)));
if (eat <= (trollHungerLevel * 3)) { /* Hungry? */ if (eat <= (trollHungerLevel * 3)) { /* Hungry? */
if (eat <= trollHungerLevel) { /* Eat the packet */ if (eat <= trollHungerLevel) { /* Eat the packet */

View file

@ -3037,6 +3037,11 @@ QH *qh = &controller->xmt_queue->hdr;
while (ddcmp_compare (controller->link.rcv_pkt[DDCMP_NUM_OFFSET], GE, R, controller)) { while (ddcmp_compare (controller->link.rcv_pkt[DDCMP_NUM_OFFSET], GE, R, controller)) {
BUFFER *buffer = dmc_buffer_allocate(controller); BUFFER *buffer = dmc_buffer_allocate(controller);
if (NULL == buffer) {
sim_debug(DBG_INF, controller->device, "%s%d: No Buffers cause NAKMissingPackets to stop\n", controller->device->name, controller->index);
break;
}
buffer->transfer_buffer = (uint8 *)malloc (DDCMP_HEADER_SIZE); buffer->transfer_buffer = (uint8 *)malloc (DDCMP_HEADER_SIZE);
buffer->count = DDCMP_HEADER_SIZE; buffer->count = DDCMP_HEADER_SIZE;
ddcmp_build_nak_packet (buffer->transfer_buffer, 2, R, DDCMP_FLAG_SELECT); ddcmp_build_nak_packet (buffer->transfer_buffer, 2, R, DDCMP_FLAG_SELECT);