⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsched.c

📁 wimax BS simulation code,implemented under linux.
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -