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

📄 alc_tx.c

📁 这个程序实现了FLUTE协议
💻 C
📖 第 1 页 / 共 3 页
字号:
			   alc_channel_t *ch,#ifdef WIN32			   ULONGLONG toi,			   ULONGLONG toi_len,#else			   unsigned long long toi,			   unsigned long long toi_len,#endif		unsigned int max_sb_len, unsigned short es_len,		unsigned char fec_enc_id, unsigned short fec_inst_id) {	int	hdrlen;		/* length of total ALC header */	unsigned char pkt[MAX_PACKET_LENGTH];	int	sendlen = 0;	unsigned char *sendbuf;	def_lct_hdr_t *def_lct_hdr;	unsigned short half_word1;	unsigned short half_word2;	unsigned int word;        	unsigned short max_16bits = 0xFFFF;	unsigned int max_32bits = 0xFFFFFFFF;#ifdef WIN32	ULONGLONG max_48bits = (ULONGLONG)0xFFFFFFFFFFFF;	ULONGLONG max_64bits = (ULONGLONG)0xFFFFFFFFFFFFFFFF;#else	unsigned long long max_48bits = 0xFFFFFFFFFFFFULL;	unsigned long long  max_64bits = 0xFFFFFFFFFFFFFFFFULL;#endif	hdrlen = sizeof(def_lct_hdr_t);			memset(pkt, 0, MAX_PACKET_LENGTH);	def_lct_hdr = (def_lct_hdr_t*)pkt;	def_lct_hdr->version = ALC_VERSION;	def_lct_hdr->flag_c = 0;	def_lct_hdr->reserved = 0;	def_lct_hdr->flag_t = 0;	def_lct_hdr->flag_r = 0;	def_lct_hdr->flag_a = 0;	def_lct_hdr->flag_b = 0; /* TODO */	def_lct_hdr->codepoint = fec_enc_id;	def_lct_hdr->cci = htonl(0);	if(s->half_word) {		if(((s->tsi <= max_16bits) && (toi <= max_16bits))) {			def_lct_hdr->flag_s = 0;			def_lct_hdr->flag_o = 0;			def_lct_hdr->flag_h = 1;			half_word1 = (unsigned short)s->tsi;			half_word2 = (unsigned short)toi;						word = ((half_word1 << 16) | (half_word2 & 0xFFFF));			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);			hdrlen += 4;		}		else if(((((s->tsi <= max_16bits) && (((toi > max_16bits) && (toi <= max_32bits))))) ||			 (((toi <= max_16bits) && (((s->tsi > max_16bits) && (s->tsi <= max_32bits))))))) {			def_lct_hdr->flag_s = 1;			def_lct_hdr->flag_o = 1;			def_lct_hdr->flag_h = 0;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)s->tsi);			hdrlen += 4;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)toi);			hdrlen += 4;			}		else if((((s->tsi > max_16bits) && (s->tsi <= max_32bits))) &&			 (((toi > max_16bits) && (toi <= max_32bits)))) {						def_lct_hdr->flag_s = 1;			def_lct_hdr->flag_o = 1;			def_lct_hdr->flag_h = 0;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)s->tsi);			hdrlen += 4;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)toi);			hdrlen += 4;		}		else if(((s->tsi <= max_16bits) && (((toi > max_32bits) && (toi <= max_48bits))))) {					def_lct_hdr->flag_s = 0;			def_lct_hdr->flag_o = 1;			def_lct_hdr->flag_h = 1;			half_word1 = (unsigned short)s->tsi;			half_word2 = (unsigned short)((toi >> 32) & 0x0000FFFF);			word = ((half_word1 << 16) | (half_word2 & 0xFFFF));			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);			hdrlen += 4;						*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)toi);			hdrlen += 4;		}		else if(((toi < max_16bits) && (((s->tsi > max_32bits) && (s->tsi <= max_48bits))))) {			def_lct_hdr->flag_s = 1;			def_lct_hdr->flag_o = 0;			def_lct_hdr->flag_h = 1;			word = (unsigned int)((s->tsi >> 16) & 0xFFFFFFFF);			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);			hdrlen += 4;					half_word1 = (unsigned short)(s->tsi & 0x0000FFFF);			half_word2 = (unsigned short)toi;			word = ((half_word1 << 16) | (half_word2 & 0xFFFF));			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);			hdrlen += 4;		}		else if((((s->tsi > max_32bits) && (s->tsi <= max_48bits))) &&			 (((toi > max_32bits) && (toi <= max_48bits)))) {					def_lct_hdr->flag_s = 1;			def_lct_hdr->flag_o = 1;			def_lct_hdr->flag_h = 1;			word = (unsigned int)((s->tsi >> 16) & 0xFFFFFFFF);			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);			hdrlen += 4;					half_word1 = (unsigned short)(s->tsi & 0x0000FFFF);			half_word2 = (unsigned short)((toi >> 32) & 0x0000FFFF);			word = ((half_word1 << 16) | (half_word2 & 0xFFFF));			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);			hdrlen += 4;						*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)toi);			hdrlen += 4;		}		else if((((s->tsi > max_16bits) && (s->tsi <= max_32bits))) &&			 (((toi > max_32bits) && (toi <= max_64bits)))) {			def_lct_hdr->flag_s = 1;			def_lct_hdr->flag_o = 2;			def_lct_hdr->flag_h = 0;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)s->tsi);			hdrlen += 4;			word = (unsigned int)((toi >> 32) & 0xFFFFFFFF);			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);			hdrlen += 4;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)toi);			hdrlen += 4;		}		else if(((s->tsi < max_16bits) && ((toi > max_48bits) && (toi <= max_64bits)))) {			def_lct_hdr->flag_s = 1;			def_lct_hdr->flag_o = 2;			def_lct_hdr->flag_h = 0;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)s->tsi);			hdrlen += 4;			word = (unsigned int)((toi >> 32) & 0xFFFFFFFF);			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);			hdrlen += 4;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)toi);			hdrlen += 4;		}		else {			printf("TSI & TOI field combination not supported!\n");			fflush(stdout);			return -1;		}	}	else {		def_lct_hdr->flag_s = 1;		def_lct_hdr->flag_h = 0;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)s->tsi);		hdrlen += 4;		if(toi <= max_32bits) {			def_lct_hdr->flag_o = 1;			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)toi);			hdrlen += 4;		}		else if(((toi > max_32bits) && (toi <= max_64bits))) {			def_lct_hdr->flag_o = 2;					word = (unsigned int)((toi >> 32) & 0xFFFFFFFF);			*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);			hdrlen += 4;					*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)toi);			hdrlen += 4;		}		else {			printf("TSI & TOI field combination not supported!\n");			fflush(stdout);			return -1;		}	}	if(toi == FDT_TOI) {		hdrlen += add_fdt_lct_he(def_lct_hdr, hdrlen, s->fdt_instance_id);#ifdef USE_ZLIB		if(s->encode_content == ZLIB_FDT || s->encode_content == ZLIB_FDT_AND_GZIP_FILES ) {			 hdrlen += add_cenc_lct_he(def_lct_hdr, hdrlen, (unsigned char)ZLIB);		}	#endif	}		if(((toi == FDT_TOI) || (s->use_fec_oti_ext_hdr == 1))) {		if(fec_enc_id == COM_NO_C_FEC_ENC_ID) {			hdrlen += add_fti_0_128_130_lct_he(def_lct_hdr, hdrlen, toi_len, 0,											   es_len, max_sb_len);		}		else if(fec_enc_id == SIMPLE_XOR_FEC_ENC_ID) {                        hdrlen += add_fti_0_128_130_lct_he(def_lct_hdr, hdrlen, toi_len, fec_inst_id,                                                                                           es_len, max_sb_len);                }		else if((fec_enc_id == COM_FEC_ENC_ID) || (fec_enc_id == SB_LB_E_FEC_ENC_ID)) {			hdrlen += add_fti_0_128_130_lct_he(def_lct_hdr, hdrlen, toi_len, fec_inst_id,											   es_len, max_sb_len);			}		else if(fec_enc_id == SB_SYS_FEC_ENC_ID) {			hdrlen += add_fti_129_lct_he(def_lct_hdr, hdrlen, toi_len, fec_inst_id,							es_len, (unsigned short)tr_block->max_k, (unsigned short)tr_block->max_n);		}	}	/* TODO: add othet LCT header extensions here */	/*if(nop) {		hdrlen += add_nop_lct_he();	}	if(auth) {		hdrlen += add_auth_lct_he();	}*/	def_lct_hdr->hdr_len = hdrlen >> 2; /* Header length in 32-bit words */		*(unsigned short*)def_lct_hdr = htons(*(unsigned short*)def_lct_hdr);	/* FEC Payload ID */	if(((fec_enc_id == COM_NO_C_FEC_ENC_ID) || (fec_enc_id == COM_FEC_ENC_ID))) {		hdrlen += add_alc_fpi_0_130(def_lct_hdr, hdrlen, (unsigned short)tr_block->sbn,						(unsigned short)tr_unit->esi);		}	else if(fec_enc_id == SIMPLE_XOR_FEC_ENC_ID) {                hdrlen += add_alc_fpi_128(def_lct_hdr, hdrlen, tr_block->sbn, tr_unit->esi);        }	else if(fec_enc_id == SB_LB_E_FEC_ENC_ID) {		hdrlen += add_alc_fpi_128(def_lct_hdr, hdrlen, tr_block->sbn, tr_unit->esi);	}	else if(fec_enc_id == SB_SYS_FEC_ENC_ID) {		hdrlen += add_alc_fpi_129(def_lct_hdr, hdrlen, tr_block->sbn,								  (unsigned short)tr_block->k,								  (unsigned short)tr_unit->esi);	}	memcpy(pkt + hdrlen, tr_unit->data, tr_unit->len);	sendlen = hdrlen + tr_unit->len;	if(ch != NULL) {		if (ch->s->calculate_session_size == false) {				sendto(ch->tx_sock, (char *)pkt, sendlen, 0,						ch->addrinfo->ai_addr, ch->addrinfo->ai_addrlen);		}	}	else {		if(!(sendbuf = (unsigned char*)calloc((sendlen + 1), sizeof(unsigned char)))) {			printf("Could not alloc memory for tx queue packet!\n");			fflush(stdout);			return -1;		}		memcpy(sendbuf, pkt, sendlen);		while(1) {			if(s->state == SExiting) {				return -2;			}			if(add_pkt_to_tx_queue(s, sendbuf, sendlen) > 0) {				break;			}			else {#ifdef WIN32				Sleep(10);#else				usleep(10000);#endif			}		}	}	add_session_sent_bytes(s->s_id, sendlen);	/* Should we take UDP/IP headers into account? */	/* UDP */	add_session_sent_bytes(s->s_id, 8);	/* IPv4 or IPv6 */	if(s->addr_family == PF_INET) {	  add_session_sent_bytes(s->s_id, 20);	}	else {	  add_session_sent_bytes(s->s_id, 40);	}	return sendlen;}/* * This function sends A flag packet to channel. * * Params:	int s_id: Session identifier, *			int ch_id: Channel identifier * * Return:	int: 0 in success, -1 otherwise * */int send_session_close_packet(int s_id, int ch_id) {	int	sendlen;			     /* number of bytes to send */	int	hdrlen;					/* length of total ALC header */	int retval = 0;	alc_channel_t *ch;	unsigned char sendbuf[MAX_PACKET_LENGTH];	/* TU (hdrs+data) cannot be larger */	def_lct_hdr_t *def_lct_hdr;		unsigned short half_word1;	unsigned short half_word2;	unsigned int word;	ch = get_alc_session(s_id)->ch_list[ch_id];		memset(sendbuf, 0, MAX_PACKET_LENGTH);	def_lct_hdr = (def_lct_hdr_t*)sendbuf;	def_lct_hdr->version = ALC_VERSION;	def_lct_hdr->flag_c = 0;	def_lct_hdr->reserved = 0;	def_lct_hdr->flag_t = 0;	def_lct_hdr->flag_r = 0;	def_lct_hdr->flag_a = 1;	def_lct_hdr->flag_b = 0;	def_lct_hdr->codepoint = ch->s->def_fec_enc_id; 	def_lct_hdr->cci = htonl(0);	hdrlen = sizeof(def_lct_hdr_t);		if(ch->s->tsi <= 0xFFFFFFFF) {				def_lct_hdr->flag_s = 1;		def_lct_hdr->flag_o = 0;		def_lct_hdr->flag_h = 0;				*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl((unsigned int)ch->s->tsi);		hdrlen += 4;	}	else {		/* TSI field length 48 bits not possible without TOI field */		def_lct_hdr->flag_s = 1;		def_lct_hdr->flag_o = 0;		def_lct_hdr->flag_h = 1;		word = (unsigned int)((ch->s->tsi >> 16) & 0xFFFFFFFF);		*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);		hdrlen += 4;			half_word1 = (unsigned short)(ch->s->tsi & 0x0000FFFF);		half_word2 = (unsigned short)0;		word = ((half_word1 << 16) | (half_word2 & 0xFFFF));		*(unsigned int*)((unsigned char*)def_lct_hdr + hdrlen) = htonl(word);		hdrlen += 4;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -