📄 alc_tx.c
字号:
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 + -