📄 dsched.c
字号:
for ( wxb = softq_deque(&g_softque[cid]); (wxb) && (grant >= wxb->len+prefix); wxb = softq_deque(&g_softque[cid]) ) { wxb->beg -= sizeof(genmachdr_t); wxb->len += prefix; wxb->mac = (genmachdr_t *)wxb->beg; genmachdr_set(wxb->mac, 0, 0, 0, 0, ci, 0, wxb->len, cid); if ( ci ) { memset(wxb->end, 0, 4); wxb->end += 4; } list_add_tail(&wxb->junior, &burst); grant -= wxb->len; tolen += wxb->len; } if ( wxb ) { softq_enque_head(&g_softque[cid], wxb); wxb = NULL; } if ( tolen != 0 ) { wxb = list_entry(burst.next, wxbuff_t, junior); wxb->tolen = tolen; list_del(&burst); } return wxb;}static wxbuff_t * build_burst_no_frag(uint16_t cid, uint8_t ci, uint8_t ext, uint32_t grant){ struct list_head burst, pdu; wxbuff_t *wxb; uint32_t prefix, pslen, tolen = 0; uint8_t type = 0; INIT_LIST_HEAD(&burst); INIT_LIST_HEAD(&pdu); if ( ext ) { pslen = sizeof(extpackshdr_t); type |= EXTENDED_TYPE_MASK; } else pslen = sizeof(packshdr_t); prefix = ci ? 10 : 6; for ( wxb = softq_deque(&g_softque[cid]); (wxb) && (grant >= wxb->len+prefix); wxb = softq_deque(&g_softque[cid]) ) { uint32_t len = prefix; grant -= prefix; while ( (wxb) && (len+wxb->len+pslen <= 2048) && (grant >= wxb->len+pslen) ) { wxb->beg -= pslen; wxb->len += pslen; wxb->ep = (extpackshdr_t *)wxb->beg; if ( ext ) extpackshdr_set(wxb->ep, NO_FRAG, g_serviceflow[cid].fsn, wxb->len); else packshdr_set(wxb->p, NO_FRAG, g_serviceflow[cid].fsn, wxb->len); g_serviceflow[cid].fsn = ext ? (g_serviceflow[cid].fsn+1) & 0x7ff : (g_serviceflow[cid].fsn+1) & 0x7; list_add_tail(&wxb->junior, &pdu); len += wxb->len; grant -= wxb->len; wxb = softq_deque(&g_softque[cid]); } if ( len > prefix ) { wxbuff_t *first = list_entry(pdu.next, wxbuff_t, junior); wxbuff_t *last = list_entry(pdu.prev, wxbuff_t, junior); first->beg -= sizeof(genmachdr_t); first->len += sizeof(genmachdr_t); first->mac = (genmachdr_t *)first->beg; genmachdr_set(first->mac, 0, 0, type|PACKING_SUBHDR_MASK, 0, ci, 0, len, cid); if ( ci ) { memset(last->end, 0, 4); last->end += 4; last->len += 4; } list_splice(&pdu, burst.prev); } tolen += len; if ( !wxb ) break; if ( grant < prefix+wxb->len+pslen ) { if ( grant >= prefix+wxb->len ) { wxb->beg -= sizeof(genmachdr_t); wxb->len += prefix; wxb->mac = (genmachdr_t *)wxb->beg; genmachdr_set(wxb->mac, 0, 0, 0, 0, ci, 0, wxb->len, cid); if ( ci ) { memset(wxb->end, 0, 4); wxb->end += 4; } tolen += wxb->len; list_add_tail(&wxb->junior, &burst); wxb = NULL; } break; } } if ( wxb ) { softq_enque_head(&g_softque[cid], wxb); wxb = NULL; } if ( tolen != 0 ) { wxb = list_entry(burst.next, wxbuff_t, junior); wxb->tolen = tolen; list_del(&burst); } return wxb;}static wxbuff_t * build_burst(uint16_t cid, uint8_t ci, uint8_t ext, uint32_t grant){ struct list_head burst, pdu; wxbuff_t *wxb; uint32_t prefix, pslen, fslen, tolen = 0; uint8_t fc, type = 0; uint16_t fsn; INIT_LIST_HEAD(&burst); INIT_LIST_HEAD(&pdu); prefix = ci ? 10 : 6; fc = g_serviceflow[cid].fc; fsn = g_serviceflow[cid].fsn; if ( ext ) { type |= EXTENDED_TYPE_MASK; pslen = sizeof(extpackshdr_t); fslen = sizeof(extfragshdr_t); } else { pslen = sizeof(packshdr_t); fslen = sizeof(fragshdr_t); } for ( wxb = softq_deque(&g_softque[cid]); (wxb) && (grant >= wxb->len+prefix); wxb = softq_deque(&g_softque[cid]) ) { uint32_t len = prefix; grant -= prefix; while ( (wxb) && (len+wxb->len+pslen <= 2048) && (grant >= wxb->len+pslen) ) { if ( fc != NO_FRAG && fc != LAST_FRAG ) fc = LAST_FRAG; wxb->beg -= pslen; wxb->len += pslen; wxb->ep = (extpackshdr_t *)wxb->beg; if ( ext ) extpackshdr_set(wxb->ep, fc, fsn, wxb->len); else packshdr_set(wxb->p, fc, fsn, wxb->len); fsn = ext ? (fsn + 1) & 0x7ff : (fsn + 1) & 0x7; list_add_tail(&wxb->junior, &pdu); len += wxb->len; grant -= wxb->len; wxb = softq_deque(&g_softque[cid]); } if ( len > prefix ) { wxbuff_t *first = list_entry(pdu.next, wxbuff_t, junior); wxbuff_t *last = list_entry(pdu.prev, wxbuff_t, junior); first->beg -= sizeof(genmachdr_t); first->mac = (genmachdr_t *)first->beg; genmachdr_set(first->mac, 0, 0, type|PACKING_SUBHDR_MASK, 0, 1, 0, len, cid); first->len += sizeof(genmachdr_t); if ( ci ) { memset(last->end, 0, 4); last->end += 4; last->len += 4; } list_splice(&pdu, burst.prev); } tolen += len; if ( !wxb ) break; if ( grant < prefix+wxb->len+pslen ) { if ( fc == FIRST_FRAG || fc == MIDDLE_FRAG ) { if ( grant < prefix+wxb->len+fslen ) { uint32_t _len = grant - prefix - fslen; wxbuff_t *_wxb; if ( (_wxb = get_wxbuff(NULL)) == NULL ) break; wxbuff_reserve(_wxb, 64); wxbuff_push(_wxb, wxb->beg, _len); wxb->beg += _len; wxb->len -= _len; softq_enque_head(&g_softque[cid], wxb); wxb = _wxb; fc = MIDDLE_FRAG; } else fc = LAST_FRAG; wxb->len += fslen; wxb->beg -= fslen; wxb->ef = (extfragshdr_t *)wxb->beg; if ( ext ) extfragshdr_set(wxb->ef, fc, fsn); else fragshdr_set(wxb->f, fc, fsn); fsn = ext ? (fsn+1) & 0x7ff : (fsn+1) & 0x7; type |= FRAGMENTATION_SUBHDR_MASK; } else { if ( grant < prefix+wxb->len && grant > prefix+fslen ) { uint32_t _len = grant - prefix - fslen; wxbuff_t *_wxb; if ( (_wxb = get_wxbuff(NULL)) == NULL ) break; wxbuff_reserve(_wxb, 64); wxbuff_push(_wxb, wxb->beg, _len); wxb->beg += _len; wxb->len -= _len; softq_enque_head(&g_softque[cid], wxb); wxb = _wxb; fc = FIRST_FRAG; wxb->len += fslen; wxb->beg -= fslen; wxb->ef = (extfragshdr_t *)wxb->beg; if ( ext ) extfragshdr_set(wxb->ef, fc, fsn); else fragshdr_set(wxb->f, fc, fsn); fsn = ext ? (fsn+1) & 0x7ff : (fsn+1) & 0x7; type |= FRAGMENTATION_SUBHDR_MASK; } } wxb->len += prefix; wxb->beg -= sizeof(genmachdr_t); wxb->mac = (genmachdr_t *)wxb->beg; genmachdr_set(wxb->mac, 0, 0, type, 0, ci, 0, wxb->len, cid); if ( ci ) { memset(wxb->end, 0, 4); wxb->end += 4; } list_add_tail(&wxb->junior, &burst); tolen += wxb->len; wxb = NULL; break; } } if ( wxb ) { softq_enque_head(&g_softque[cid], wxb); wxb = NULL; } g_serviceflow[cid].fc = fc; g_serviceflow[cid].fsn = fsn; if ( tolen != 0 ) { wxb = list_entry(burst.next, wxbuff_t, junior); wxb->tolen = tolen; list_del(&burst); } return wxb;}static void do_watchdog(uint32_t arga, void *argb){ time_t tm; time(&tm); fprintf(stdout, "dsched do_watchdog @ jiffies:%d, %s", jiffies, ctime(&tm)); set_bit(SCHED_WATCHDOG_TIMEOUT, (volatile unsigned long *)&g_dlschedque.signal); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -