示例#1
0
文件: retrans.c 项目: rmlawton/LDM
int prod_retrans_abort_entry (ACQ_TABLE *p_acqtable, long prod_seqno, int err_cause)
{
	static char FNAME[]="retrans_abort_entry";

	int		index_value;		/* index for prod_seqno */
	int		retrans_table_typ;	/* retrans table type */
	PROD_RETRANS_ENTRY *p_retrans_entry;
	PROD_RETRANS_ENTRY_INFO *p_retrans_entry_info;

	if(prod_retrans_get_addr(p_acqtable->proc_base_channel_type_last, p_prod_retrans_table,
		&p_retrans_entry_info, &p_retrans_entry, &retrans_table_typ) < 0){
			uerror("%s ignore abort \n",FNAME);
			return(ERROR);
		}

	/* Now get the index value */
	index_value = prod_seqno % 
		p_retrans_entry_info->numb_entries;
	if(index_value < 0) {
		index_value = -index_value;
	}
	if(index_value >= p_retrans_entry_info->numb_entries) {
		index_value = 0;
	}

	if(ulogIsVerbose ()){
		uinfo("%s ok abort %s tbl[%d]=%ld\n",FNAME,
		GET_SBN_TYP_NAME(p_acqtable->proc_base_channel_type_last),
		index_value,
		p_retrans_entry[index_value].prod_seqno);
	}

	prod_retrans_update_entry(p_acqtable, (BUFF_HDR *)NULL,
		p_retrans_entry_info,
		&p_retrans_entry[index_value], 
		index_value,
		prod_seqno, 
		p_acqtable->proc_prod_run_id,
		RETRANS_ENTRY_FLAG_AVAIL, err_cause);

	return(0);
	

}
示例#2
0
int generate_retrans_rqst(ACQ_TABLE *p_acqtable, 
		long first_prod_seqno,
		long last_prod_seqno,
		int rqst_cause)
{
	static char FNAME[] = "generate_retrans_rqst";

	static ulong request_numb;
	int prod_lost;
	PIPE_RETRANSMIT_HDR pipe_request_hdr;
	PIPE_RETRANSMIT_HDR *p_pipe_requesthdr;
        size_t bytes_written;
        time_t tmp_time;

	request_numb++;

	prod_lost = (last_prod_seqno - first_prod_seqno) + 1;
	if(prod_lost < 0)
		prod_lost = 0;

	p_acqtable->proc_tot_prods_retrans_rqstd += prod_lost;
	time(&p_acqtable->proc_last_retrans_rqst);

	if(global_retransmitpipe_fd <= 0){
		/* Unable to open/write to pipe */
		log_error("Unable to open or write to pipe %s \n",DEFAULT_RETRANSMIT_PIPENAME);
		return (0);
	}
	
	p_pipe_requesthdr = &pipe_request_hdr;

	p_pipe_requesthdr->pipe_ctl_flag = 0;

	if(p_acqtable->proc_retransmit_ctl_flag & ENABLE_RETRANS_XMIT_RQST){
		p_pipe_requesthdr->pipe_ctl_flag |= ENABLE_RETRANS_XMIT_RQST;
	}

	p_pipe_requesthdr->pipe_request_numb = request_numb;
	p_pipe_requesthdr->pipe_link_id = p_acqtable->link_id;
	p_pipe_requesthdr->pipe_channel_type = p_acqtable->proc_base_channel_type_last;
	p_pipe_requesthdr->pipe_first_prod_seqno = (int)first_prod_seqno;
	p_pipe_requesthdr->pipe_last_prod_seqno = (int)last_prod_seqno;
	p_pipe_requesthdr->pipe_run_numb = (int) p_acqtable->proc_prod_run_id;
	p_pipe_requesthdr->pipe_cpio_addr = (int) global_cpio_addr;
	time(&tmp_time);
        p_pipe_requesthdr->pipe_request_time = (int) tmp_time;
	p_pipe_requesthdr->pipe_delay_send = p_acqtable->proc_retransmit_delay_send;
	
	p_pipe_requesthdr->pipe_request_cause = RETRANS_RQST_CAUSE_RCV_ERR;


	log_debug("pipe_request_numb = %ld | ctl_flag = %d | link_id = %d | channel_type = %d | rqst cause = %d \n",
			p_pipe_requesthdr->pipe_request_numb,p_pipe_requesthdr->pipe_ctl_flag,p_pipe_requesthdr->pipe_link_id,
			p_pipe_requesthdr->pipe_channel_type,p_pipe_requesthdr->pipe_request_cause);

	log_debug("cpio addr = %ld | rqst time = %ld | first prod seqno = [%d-%ld] | last prod seqno = %ld | run number = %d | delay_send = %d \n",
			p_pipe_requesthdr->pipe_cpio_addr, p_pipe_requesthdr->pipe_request_time,p_pipe_requesthdr->pipe_first_prod_seqno,first_prod_seqno,
			p_pipe_requesthdr->pipe_last_prod_seqno,p_pipe_requesthdr->pipe_run_numb,p_pipe_requesthdr->pipe_delay_send);

	/* Now write to pipe */
	if((bytes_written = write(global_retransmitpipe_fd,
		p_pipe_requesthdr, sizeof(PIPE_RETRANSMIT_HDR))) !=
			sizeof(PIPE_RETRANSMIT_HDR)) {
		log_error("FAIL write#%ld pipe[%d] tot(%ld) %s link[%d] prod(%ld-%ld)\n",
			p_pipe_requesthdr->pipe_request_numb,
			global_retransmitpipe_fd,
			p_acqtable->proc_tot_prods_retrans_rqstd, 
			GET_SBN_TYP_NAME(p_pipe_requesthdr->pipe_channel_type),
			p_pipe_requesthdr->pipe_link_id,
			first_prod_seqno, last_prod_seqno);
	} else {
		if(first_prod_seqno != last_prod_seqno) {
			log_info("OK rqst#%ld tot(%ld) %s link[%d] prod(%ld-%ld)\n",
				request_numb,
				p_acqtable->proc_tot_prods_retrans_rqstd, 
				GET_SBN_TYP_NAME(p_pipe_requesthdr->pipe_channel_type),
				p_pipe_requesthdr->pipe_link_id,
				first_prod_seqno, last_prod_seqno);
		} else {
			log_info("OK rqst#%ld tot(%ld) %s link[%d] prod(%ld)\n",
				request_numb,
				p_acqtable->proc_tot_prods_retrans_rqstd, 
				GET_SBN_TYP_NAME(p_pipe_requesthdr->pipe_channel_type),
				p_pipe_requesthdr->pipe_link_id,
				last_prod_seqno);
		}
	}

	return(0);

	
}