void ConnectionPool::remove_old_connections() { TooOld<ConnectionInfo> too_old(max_idle_time()); PoolIt it = pool_.begin(); while ((it = std::find_if(it, pool_.end(), too_old)) != pool_.end()) { remove(it++); } }
void process_blocks(struct gprs_tbf *t, int ul) { uint8_t bsn, bsn2; struct gprs_frag *f; struct gprs_lime *l; unsigned i, skip; unsigned llc_len = 0; uint8_t llc_data[65536]; uint8_t llc_first_bsn; uint8_t llc_last_bsn = 0; uint8_t li_off; uint32_t current_fn; /* get current "time", oldest unreassembled frag */ bsn = t->start_bsn; while (t->frags[bsn].len == 0) { bsn = (bsn+1)%128; if (bsn == t->start_bsn) { printf("no valid blocks in current TBF!\n"); fflush(stdout); return; } } current_fn = t->frags[bsn].fn; t->start_bsn = bsn; /* walk through framents, mark reassembled/used blocks */ skip = 0; for (bsn = t->start_bsn; bsn != ((t->last_bsn+1)%128); bsn = (bsn+1)%128) { /* get frament descriptor */ f = &t->frags[bsn]; printf(" bsn %d ", bsn); fflush(stdout); /* already processed or null */ if (!f->len) { printf("null\n"); fflush(stdout); llc_len = 0; skip = 1; continue; } /* check frament age */ if (too_old(current_fn, f->fn)) { printf("old sement\n"); fflush(stdout); llc_len = 0; skip = 1; continue; } /* update "time" */ current_fn = f->fn; if (llc_len && !bsn_is_next(llc_last_bsn, bsn)) { printf("missing bsn, previous %d\n", llc_last_bsn); fflush(stdout); llc_len = 0; skip = 1; continue; } /* check for multiple blocks/parts */ if (f->n_blocks == 0) { /* check if first part of message */ if (!llc_len) llc_first_bsn = bsn; /* append data to buffer */ memcpy(&llc_data[llc_len], f->data, f->len); llc_len += f->len; llc_last_bsn = bsn; /* last TBF block? (very rare condition) */ if (f->last) { printf("end of TBF\n"); fflush(stdout); print_pkt(llc_data, llc_len); net_send_llc(llc_data, llc_len, ul); /* reset all framents */ for (bsn2 = 0; bsn2 < 128; bsn2++) { f = &t->frags[bsn2]; f->len = 0; f->n_blocks = 0; } /* reset buffer state */ llc_len = 0; t->start_bsn = 0; } } else { /* multiple data parts */ li_off = 0; for (i=0; i<f->n_blocks; i++) { printf("\nlime %d\n", i); fflush(stdout); l = &f->blocks[i]; if (l->used) { if (llc_len) { // error! printf("\nlime error!\n"); fflush(stdout); llc_len = 0; } } else { if (!llc_len) llc_first_bsn = bsn; /* append data to buffer */ memcpy(&llc_data[llc_len], &f->data[li_off], l->li); llc_len += l->li; llc_last_bsn = bsn; if (!l->e || !l->m || (l->e && l->m)) { /* message ends here */ printf("end of message reached\n"); fflush(stdout); print_pkt(llc_data, llc_len); net_send_llc(llc_data, llc_len, ul); /* mark frags as used */ l->used = 1; if (llc_first_bsn != bsn) { } llc_len = 0; if (!skip) t->start_bsn = bsn; } } li_off += l->li; } /* is spare data valid? */ if (l->m) { if (llc_len) { printf("spare and buffer not empty!\n"); print_pkt(llc_data, llc_len); fflush(stdout); } if ((f->len > li_off) && (f->len-li_off < 65536)) { memcpy(llc_data, &f->data[li_off], f->len-li_off); llc_len = f->len - li_off; llc_first_bsn = bsn; llc_last_bsn = bsn; t->start_bsn = bsn; } } } } /* shift window if needed */ if (((t->last_bsn - t->start_bsn) % 128) > 64) { t->start_bsn = (t->last_bsn - 64) % 128; printf("shifting window\n"); fflush(stdout); } }