Example #1
0
int GetPattern(struct sockaddr_in ServerID, char *patternbuf, int pattern_max, struct htx_data * stats)
{
    SOCKET ToServerSock;
    int rc;
    int i;
    struct CoordMsg CMsg;
    int pflength;
	char msg_text[1024]; 

    ToServerSock = SetUpConnect(&ServerID, stats, 0); 
    memset(&CMsg, '\0', sizeof(CMsg));
    CMsg.msg_type = htonl(CM_REQ_PATTERN);
    CMsg.ID.Wsize.size = htonl((uint32_t)pattern_max);
    rc = StreamWrite(ToServerSock, (char *) &CMsg, sizeof(CMsg));
    if(rc == -1) {
        sprintf(msg_text, "GetPattern: Error writing to Server - %s\n", STRERROR(errno));
        hxfmsg(stats, HTXERROR(EX_PATT1,ERRNO), HTX_HE_SOFT_ERROR, msg_text);
        HE_exit(EX_PAT1);
    }
    rc = StreamRead(ToServerSock, (char *) &CMsg, sizeof(CMsg));
    CMsg.msg_type = ntohl(CMsg.msg_type);
    if(CMsg.msg_type != CM_PATTERN) {
        sprintf(msg_text, "GetPattern: Unable to obtain pattern file - %s\n", STRERROR(errno));
        hxfmsg(stats, HTXERROR(EX_PATT2,ERRNO), HTX_HE_SOFT_ERROR, msg_text);
        HE_exit(EX_PAT2);
    }
    pflength = ntohl(CMsg.ID.Wsize.size);
    if(pflength > pattern_max || pflength <= 0) {
        sprintf(msg_text, "GetPattern: Server wrote too many characters - %s\n", STRERROR(errno));
        hxfmsg(stats, HTXERROR(EX_PATT3,ERRNO), HTX_HE_SOFT_ERROR, msg_text);
        HE_exit(EX_PAT3);
    }
    rc = StreamRead(ToServerSock, (char *) patternbuf, pflength);
    if(rc != pflength) {
        sprintf(msg_text, "GetPattern: Unable to receive pattern file - %s\n", STRERROR(errno));
        hxfmsg(stats, HTXERROR(EX_PATT4,ERRNO), HTX_HE_SOFT_ERROR, msg_text);
        HE_exit(EX_PAT4);
    }

    closesocket(ToServerSock);

/********************************************************************/
/* Fill remainder of patternbuf.                                    */
/********************************************************************/
    for(i=pflength; i<pattern_max; i++)
        patternbuf[i] = patternbuf[i%pflength];
    return pattern_max;
}
Example #2
0
unsigned long long
memory_per_thread(unsigned int pvr) {

    char msg_buf[1024];

    /* General concept here is Fabricbus exerciser 
	 * needs to write to  2 * L3CACHE_SIZE to push the 
	 * data on fabric busses 
	 */
    if(pvr == PVR_POWER6) {
        return(2 * P6_L3CACHE_SIZE);
    } else if(pvr == PVR_POWER7) {
    	/* Due to P7 and above systems LCO affinity, L3 private cache for each core cache are shared,
     	 * to get a memory out of NODE,
     	 * effective L3 memory size = 2 * NUM_CORES_PER_CHIP * L3CACHE_SIZE
     	 */
        return(2 * P7_MAX_CORES_PER_CHIP * P7_L3CACHE_SIZE);
    } else if(pvr == PVR_POWER7PLUS) {
    	/* Its just a plus added to Power7, everything else remains same */
        return(2 * P7PLUS_MAX_CORES_PER_CHIP * P7PLUS_L3CACHE_SIZE) ;
    } else if(pvr == PVR_POWER8_MURANO) {
    	/* MURANO has 6 cores per chip */
        return(2 * P8_MURANO_MAX_CORES_PER_CHIP * P8_L3CACHE_SIZE);
    } else if(pvr == PVR_POWER8_VENICE || pvr == PVR_POWERP8P_GARRISION) {
        return(2 * P8_VENICE_MAX_CORES_PER_CHIP * P8_L3CACHE_SIZE);
    }else if(pvr == PVR_POWER9_NIMBUS){
        return(2 * P9_NIMBUS_MAX_CORES_PER_CHIP * P9_L3CACHE_SIZE);
    }else if(pvr == PVR_POWER9_CUMULUS){
        return(2 * P9_CUMULUS_MAX_CORES_PER_CHIP * P9_L3CACHE_SIZE);
    } else {
        sprintf(msg_buf, " %s, Illegal PVR = %#x \n", __FUNCTION__, pvr);
        hxfmsg(&htx_d, 0, HTX_HE_HARD_ERROR, msg_buf);
        exit(1);
    }
}
Example #3
0
void Cmsg::SendMsg(int err, enum sev_code sev) 
{                                             
	if(ArgData->Flags&ABORT) return;

	if(ArgData->Rules.crash==2) { 
		if(sev==HTX_SYS_HARD_ERROR ||
			sev==HTX_HE_HARD_ERROR ||
			 sev==HTX_HE_SOFT_ERROR) {
			/*
			 * libmisc in linux will provide do_trap_htx for this purpose
			 * once its ready, it will be implemented..
			 */
#ifndef __HTX_LINUX__
			trap((int) MISC,(int) 2,(int) 2,(int) ArgData->my_ttynum);
#endif
		}
	}
	if(sev!= HTX_HE_INFO) {

		// add pass info to msg_text
		char add_info[512];
		sprintf(add_info,"\nbase num_oper=%d,"
				" ixon=%c, ixoff=%c,"
				" rts=%d, dtr=%d"
				" num_chars=%d,"
				" bufsize=%d,\n"
				"direction=%d,"
				" baudrate=%d,"
				" chsize=%d,"
				" cstop=%d,"
				" parity=%c"
				" wrap_type=%d,"
				" Flags=%02X,\n"
				"rule_id=%s,"
				" pass_count=%d",
				ArgData->Rules.num_oper,
				ArgData->Rules.ixon,
				ArgData->Rules.ixoff,
				ArgData->Rules.rts,
				ArgData->Rules.dtr,
				ArgData->Rules.num_chars,
				ArgData->Rules.bufsize,
				ArgData->Rules.default_dir,
				ArgData->TestParms.BaudRate,
				ArgData->TestParms.ChSize,
				ArgData->TestParms.CStopB,
				ArgData->TestParms.Parity,
				ArgData->TestParms.wrap_type,
				ArgData->Flags,
				ArgData->Rules.rule_id,
				(int)ArgData->pass_count);
		strcat(msg_text,add_info);
	}

	 hxfmsg(TempStatsPtr,err,sev,msg_text );
	return;
} 
Example #4
0
int prefetch_randomise_dscr(unsigned long long random_number, unsigned int what, unsigned int thread_no) {

/*
   Structure of DSCR
   +------------+-------+-------+-------+-------+-------+-------+-----------+-------+-------+-------+-------+-------+
   |    //      |  SWTE | HWTE  |  STE  |  LTE  | SWUE  | HWUE  |  UNIT CNT |  URG  |  LSD  | SNSE  |  SSE  | DPFD  |
   +------------+-------+-------+-------+-------+-------+-------+-----------+-------+-------+-------+-------+-------+
   0          3839      40      41      42      43      44      45        5455	  5758      59      60      61      63
 */

	unsigned long long 		local_random_number;
	unsigned long long	read_dscr;
	int rc = 0;

	mfspr_dscr(&read_dscr);
	th_array[thread_no].read_dscr_val = read_dscr;
	switch ( what ) {
		case DSCR_RANDOM:
			mtspr_dscr(random_number);
			th_array[thread_no].written_dscr_val = random_number;
			rc = 0;
			break;
		case DSCR_LSDISABLE:
			local_random_number = random_number | (0x1<<5);
			mtspr_dscr(random_number);
			th_array[thread_no].written_dscr_val = random_number;
#ifdef DEBUG
			printf("[%d] Original random number = 0x%x , After setting 58th bit = 0x%x\n",__LINE__,random_number,local_random_number);
#endif
			rc = 0;
			break;
		case DSCR_DEFAULT:
			break;
		default:
			sprintf(msg,"[%d] Wrong parameter = %d\n", __LINE__, what);
			hxfmsg(&h_d, -1, HTX_HE_HARD_ERROR, msg);
			rc = -1;
			break;
	}
	/*sleep (1);*/
	return rc;
}
Example #5
0
void prefetch_irritator(void *arg)
{
    int i, rc, no_of_pages, tid , thread_no, tc, oper , number_of_operations;
    unsigned long long  saved_seed, random_no , starting_address , memory_fetch_size;
	pthread_t ptid;
	unsigned char *start_addr;
    struct thread_context *th = (struct thread_context *)arg;
 	struct ruleinfo *current_rule 	= th->current_rule;
	int cache_type = current_rule->tgt_cache;
	int cache_line_size = system_information.cinfo[cache_type].line_size;
	unsigned int loop_count 	;
	long int	offset;
	unsigned long long temp_storage = 0x1, temp_pattern = 0x1;

    /*
     * char *contig_mem[NUM_SEGS*SEG_SIZE/(16*M)]; Physically contiguous
     * memory pointer. memory_set_size variable  gives total memory
     * allocated both are variables of global structure.
     */

    thread_no = th->thread_no ;
	int pcpu = pcpus_thread_wise[thread_no];
    tid       = th->bind_to_cpu;    /* Bind to the processor */
	ptid	  = th->tid;			/* PThread Id for this thread	*/
	prefetch_streams 	= th->prefetch_streams;		/* Number of prefetch streams for this thread. 	*/

    if (current_rule->testcase_type != PREFETCH_ONLY) {
        /* Set Thread Cancel Type as ASYNCHRONOUS */
        pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
    }

    #ifdef __HTX_LINUX__
       /*printf(" Prefetch:calling htx_bind with pcpu=%d for thread_no= %d\n",pcpu,thread_no);*/
    if(pcpu == -1){
        pcpu = htx_bind_thread(tid, -1);
        rc = pcpu;
        pcpus_thread_wise[thread_no]=pcpu;
        if(pcpu < 0){
            pcpus_thread_wise[thread_no]= -1;
        }

    }
    else {
        rc = htx_bind_thread(tid,pcpu);
    }
    #else
        rc = bindprocessor(BINDTHREAD, thread_self(), tid);
    #endif
		DEBUG_LOG("[%d] thread %d, binding to cpu %d \n",__LINE__,thread_no,tid);
	    
		if(rc < 0) {
	#ifdef __HTX_LINUX__
            if( rc == -2) {
				tot_thread_count --;
                sprintf(msg,"lcpu:%d(pcpu=%d) prefetch has been hot removed, thread will be terminating now tot_thread_count=%d\n",tid,pcpu,tot_thread_count);
                hxfmsg(&h_d, errno, HTX_HE_INFO, msg);
                pthread_exit(NULL);
            }
            else {
                sprintf(msg, "%d: Bindprocessor for prefetch irritator on lcpu:%d and corresponding pcpu:%d failed with rc=%d\n", __LINE__, tid,pcpu,rc);
                hxfmsg(&h_d, errno, HTX_HE_HARD_ERROR, msg);
            }

		#else
        sprintf(msg, "Binding to cpu:%d  failed with errno: %d \n",tid,errno);
        hxfmsg(&h_d, errno, HTX_HE_SOFT_ERROR, msg);

		#endif

        } /* End of if */
        else {
			/*sprintf(msg,"::physical cpu:%d for log cpu:%d\n",pcpu,tid);
            hxfmsg(&h_d, rc , HTX_HE_INFO, msg);*/
            #ifdef DEBUG
            sprintf(msg,"[%d] Bindprocessor success [prefetch thread_bo %d]! cpu_no : %d , pthread id : 0x%x \n",__LINE__,thread_no,tid,ptid);
            hxfmsg(&h_d, errno, HTX_HE_INFO, msg);
            #endif
        }

        th->seedval = time(NULL);
        srand48_r(th->seedval,&th->buffer);

       number_of_operations = current_rule->num_oper;

		starting_address = (unsigned long long)(th_array[thread_no].start_of_contiguous_memory);
		memory_fetch_size = current_rule->prefetch_memory_size - BYTES_EXC ;
		loop_count	= memory_fetch_size / cache_line_size;
       for (oper = 0; oper < number_of_operations ; oper++) {

        /* if SIGTERM was received, exit */
        if(exit_flag != 0) {
            break;
        }

        random_no = get_random_number_perf(thread_no);
        random_no = (unsigned long long)(random_no<<32) | (random_no);
		/*random_no = 0xaabbccdd;
		random_no = th_array[thread_no].random_pattern;*/
        th_array[thread_no].prev_seed = random_no;

		/* Now write DSCR if needed */
		if ( system_information.pvr >= POWER8_MURANO ) {
			prefetch_randomise_dscr(random_no, th->current_rule->pf_dscr , thread_no);
		}

        if (th_array[thread_no].prefetch_algorithm == RR_ALL_ENABLED_PREFETCH_ALGORITHMS) {
            /* Run all the enabled prefetch variants in round robin method */

            /* If prefetch nstride is set in the current prefetch configuration */
            if ( (PREFETCH_NSTRIDE & current_rule->pf_conf) == PREFETCH_NSTRIDE ) {
                n_stride(starting_address,memory_fetch_size,random_no,&th_array[thread_no].prefetch_scratch_mem[0]);
            }

        	/* if SIGTERM was received, exit */
            if (exit_flag != 0) {
                break;
            }

            /* If prefetch partial is set in the current prefetch configuration */
            if ( (PREFETCH_PARTIAL & current_rule->pf_conf) == PREFETCH_PARTIAL ) {
                partial_dcbt(starting_address,memory_fetch_size,random_no,&th_array[thread_no].prefetch_scratch_mem[0]);
            }

        	/* if SIGTERM was received, exit */
            if (exit_flag != 0) {
                break;
            }

            if ( (PREFETCH_IRRITATOR & current_rule->pf_conf) == PREFETCH_IRRITATOR ) {
				rc = do_prefetch( starting_address , memory_fetch_size , random_no, thread_no, loop_count, th_array[thread_no].pattern);
				if ( rc != 0 ) {
					sprintf(msg,"[%d] Miscompare in Prefetch!! Expected data = 0x%x Actual data = 0x%x thread_index : 0x%x Start of memory = %p, memory size = 0x%x\n"
								,__LINE__,th_array[thread_no].pattern, *(unsigned long long *)((unsigned char *)starting_address + 128*(loop_count-rc)), thread_no, starting_address, memory_fetch_size);
					hxfmsg(&h_d, 0, HTX_HE_MISCOMPARE, msg);
					dump_miscompare_data(thread_no, (unsigned char *)starting_address);
					return;
				}
                /*prefetch(starting_address,memory_fetch_size,random_no,&th_array[thread_no].prefetch_scratch_mem[0]);*/
            }

        	/* if SIGTERM was received, exit */
            if (exit_flag != 0) {
                break;
            }

            if( (PREFETCH_TRANSIENT & current_rule->pf_conf) == PREFETCH_TRANSIENT ) {
				/*lrand48_r(&th->buffer, &offset);*/
				offset		= random_no % (long)16;

				start_addr = (unsigned char *)starting_address + offset;
				rc = transient_dcbt((unsigned long long)start_addr, loop_count, th_array[thread_no].pattern );
				if ( rc != 0 ) {
					sprintf(msg,"[%d] Miscompare in Prefetch!! Expected data = 0x%x Actual data = 0x%x thread_index : 0x%x Start of memory = %p, memory size = 0x%x\n"
								,__LINE__,th_array[thread_no].pattern, *(unsigned long long *)((unsigned char *)starting_address + 128*(loop_count-rc)), thread_no, starting_address, memory_fetch_size);
					hxfmsg(&h_d, 0, HTX_HE_MISCOMPARE, msg);
					dump_miscompare_data(thread_no, (unsigned char *)starting_address);
					return;
				}
            }

        	/* if SIGTERM was received, exit */
            if (exit_flag != 0) {
                break;
            }

			if ( (PREFETCH_NA & current_rule->pf_conf) == PREFETCH_NA ) {

				/*lrand48_r(&th->buffer, &offset);*/
				offset		= random_no % (long)16;
				start_addr = (unsigned char *)starting_address + offset;
				rc = prefetch_dcbtna((unsigned long long)start_addr, loop_count, th_array[thread_no].pattern,&temp_storage,&temp_pattern);
				if ( rc != 0 ) {
					sprintf(msg,"[%d] Miscompare in Prefetch!! Expected data = 0x%x Actual data = 0x%x copied data = %x0x, copied pattern = %x0x, thread_index : 0x%x Start of memory = %p, memory size = 0x%x\n"
								,__LINE__,th_array[thread_no].pattern, *(unsigned long long *)((unsigned char *)starting_address + 128*(loop_count-rc)), temp_storage, temp_pattern, thread_no, starting_address, memory_fetch_size);
					hxfmsg(&h_d, 0, HTX_HE_MISCOMPARE, msg);
					dump_miscompare_data(thread_no, (unsigned char *)starting_address);
					return;
				}
			}
            if (exit_flag != 0) {
                break;
            }

        }
        else { /* Else Run only the specified algorithm */
            /*starting_address = (unsigned long long)(th_array[thread_no].start_of_contiguous_memory);
            memory_fetch_size = current_rule->prefetch_memory_size - BYTES_EXC ;*/

            if(th_array[thread_no].prefetch_algorithm == PREFETCH_NSTRIDE) {
				/*lrand48_r(&th->buffer, &random_no);*/
                n_stride(starting_address, memory_fetch_size, random_no, &th_array[thread_no].prefetch_scratch_mem[0]);
            }
            else if(th_array[thread_no].prefetch_algorithm == PREFETCH_PARTIAL) {
                partial_dcbt(starting_address, memory_fetch_size, random_no, &th_array[thread_no].prefetch_scratch_mem[0]);
            }
            else if(th_array[thread_no].prefetch_algorithm == PREFETCH_TRANSIENT) {
				/*lrand48_r(&th->buffer, &offset);*/
				offset		= random_no % (long)16;
				start_addr = (unsigned char *)starting_address + offset;

				rc = transient_dcbt((unsigned long long)start_addr, loop_count, th_array[thread_no].pattern );
				if ( rc != 0 ) {
					sprintf(msg,"[%d] Miscompare in Prefetch!! Expected data = 0x%x Actual data = 0x%x thread_index : 0x%x Start of memory = %p, memory size = 0x%x\n"
								,__LINE__,th_array[thread_no].pattern, *(unsigned long long *)((unsigned char *)starting_address + 128*(loop_count-rc)), thread_no, starting_address, memory_fetch_size);
					hxfmsg(&h_d, 0, HTX_HE_MISCOMPARE, msg);
					dump_miscompare_data(thread_no, (unsigned char *)starting_address);
					return;
				}
            }
            else if(th_array[thread_no].prefetch_algorithm == PREFETCH_IRRITATOR) {
				rc = do_prefetch( starting_address , memory_fetch_size , random_no, thread_no, loop_count, th_array[thread_no].pattern);
				if ( rc != 0 ) {
					sprintf(msg,"[%d] Miscompare in Prefetch!! Expected data = 0x%x Actual data = 0x%x thread_index : 0x%x Start of memory = %p, memory size = 0x%x\n"
								,__LINE__,th_array[thread_no].pattern, *(unsigned long long *)((unsigned char *)starting_address + 128*(loop_count-rc)), thread_no, starting_address, memory_fetch_size);
					hxfmsg(&h_d, 0, HTX_HE_MISCOMPARE, msg);
					dump_miscompare_data(thread_no, (unsigned char *)starting_address);
					return;
				}
            }
			else if ( th_array[thread_no].prefetch_algorithm == PREFETCH_NA ) {
				/*lrand48_r(&th->buffer, &offset);*/
				offset		= random_no % (long)16;
				start_addr = (unsigned char *)starting_address + offset;
				rc = prefetch_dcbtna((unsigned long long)start_addr, loop_count, th_array[thread_no].pattern,&temp_storage, &temp_pattern);
				if ( rc != 0 ) {
					sprintf(msg,"[%d] Miscompare in Prefetch ( returned %d)!! Expected data = 0x%x Actual data = 0x%x copied data = 0x%x, copied pattern = 0x%x, thread_index : 0x%x Start of memory = %p, offset = %d\n"
								,__LINE__, rc, th_array[thread_no].pattern, *(unsigned long long *)((unsigned char *)start_addr + 128*(loop_count-rc)), temp_storage, temp_pattern, thread_no, starting_address, offset);
					hxfmsg(&h_d, 0, HTX_HE_MISCOMPARE, msg);
					dump_miscompare_data(thread_no, (unsigned char *)starting_address);
					return;
				}
			}

        	/* if SIGTERM was received, exit */
            if(exit_flag != 0) {
                break;
            }
        }

    } /* End of for loop */
	#ifdef __HTX_LINUX__
        /* Restore original/default CPU affinity so that it binds to ANY available processor */

        rc = htx_unbind_thread();
	#else
        rc = bindprocessor(BINDTHREAD, thread_self(), PROCESSOR_CLASS_ANY);
	#endif
        if(rc == -1) {
                sprintf(msg, "%d: Unbinding from cpu:%d failed with errno %d \n",__LINE__, tid, errno);
                hxfmsg(&h_d, errno, HTX_HE_SOFT_ERROR, msg);
        }
	
#if defined(__HTX_MAMBO__) || defined(AWAN)
	printf("[%d] Thread no: %d, completed passes : %d\n",__LINE__, thread_no, oper);
#endif
}
Example #6
0
int GetRules(struct sockaddr_in ServerID, struct rule_format rule[], int max_rules, struct htx_data * stats)
{
    SOCKET ToServerSock;
    struct CoordMsg CMsg;
    int rc;
    int i;
    int NoStanzas;
	char msg[1024]; 
	errno = 0;     

    ToServerSock = SetUpConnect(&ServerID, stats, 0); 
    memset(&CMsg, '\0', sizeof(CMsg));
    CMsg.msg_type = htonl(CM_REQ_RULES);
    CMsg.ID.Wsize.size  = htonl((uint32_t)sizeof(struct rule_format));
    rc = StreamWrite(ToServerSock, (char *) &CMsg, sizeof(CMsg));
    if(rc == -1) {
        sprintf(msg, "GetRules: Error writing to Server - %s\n", STRERROR(errno));
        hxfmsg(stats, HTXERROR(EX_RULE1,ERRNO), HTX_HE_SOFT_ERROR, msg);
        HE_exit(EX_RULE1);
    }
    StreamRead(ToServerSock, (char *) &CMsg, sizeof(CMsg));
    CMsg.msg_type = ntohl(CMsg.msg_type);
    CMsg.ID.Wsize.size  = ntohl(CMsg.ID.Wsize.size);
    if(CMsg.msg_type != CM_RULES_STANZA) {
        sprintf(msg, "GetRules: Illegal Packet recvd.\n"); 
        hxfmsg(stats, HTXERROR(EX_RULE3,0), HTX_HE_SOFT_ERROR, msg);
        HE_exit(EX_RULE3);
    }
	#ifdef __DEBUG__
		sprintf(msg, "GetRules: Sock = %d, Recvd msg = %x of size = %#x, rule_format size = %x, pid = %d \n", ToServerSock, CMsg.msg_type, sizeof(CMsg), (uint32_t)sizeof(struct rule_format), getpid()); 
		hxfmsg(stats, 0, 7, msg); 
	#endif 
    memset(rule, '\0', sizeof(struct rule_format) * max_rules);
	memset(&CMsg, '\0', sizeof(CMsg));
    for(i=0; i < max_rules; i++) {

        rc = StreamRead(ToServerSock, (char *) &CMsg.msg_type, sizeof(CMsg.msg_type));
        CMsg.msg_type = ntohl(CMsg.msg_type);
	#ifdef __DEBUG__
		sprintf(msg, "i = %#x, GetRules: Recvd msg = %x, of size = %x \n", i, CMsg.msg_type, sizeof(CMsg.msg_type)); 
		hxfmsg(stats, 0, 7, msg); 
	#endif 
        if(CMsg.msg_type == CM_RULES_FINISHED)
            break;
		 
        if(CMsg.msg_type != CM_RULES_STANZA) {
            sprintf(msg, "GetRules: Unable to obtain rules - type %x\n", (int)CMsg.msg_type);
            hxfmsg(stats, HTXERROR(EX_RULE2,ERRNO), HTX_HE_SOFT_ERROR, msg);
            HE_exit(EX_RULE2);
        }
		 
        rc = StreamRead(ToServerSock, (char*) &rule[i], sizeof(struct rule_format));
        if(rc != sizeof(struct rule_format)) {
            sprintf(msg, "GetRules: Unable to read rules from server - %s\n", STRERROR(errno));
            hxfmsg(stats, HTXERROR(EX_RULE4,ERRNO), HTX_HE_SOFT_ERROR, msg);
			HE_exit(EX_RULE3); 

        }

        NetToHostRules(&rule[i]);
    }
    NoStanzas = i;
    closesocket(ToServerSock);
    return NoStanzas;
}
Example #7
0
int
read_hardware_config(SYS_CONF_TYP * scfg, unsigned int tot_cpus, unsigned int pvr)  {

    int i, j = 0;
    int bind_to_cpu , rc, pir;
	int node, chip , proc;
    char msg[4096];
	SYS_CONF_TYP physical_scfg ;
	int num_nodes = 0, chips_per_node = 0;

    for(i = 0; i < MAX_CPUS ; i++) {
        l_p[i] = NO_CPU_DEFINED;
    }
#ifndef __HTX_LINUX__
    for(i = 0 ; i < tot_cpus ; i++ ) {
        bind_to_cpu = i ;
       	rc = bindprocessor(BINDPROCESS, getpid(), bind_to_cpu);
        if(rc == -1) {
            sprintf(msg, "\n bindprocessor failed with rc = %d, i = %d, errno = %d", rc, i, errno);
			hxfmsg(&htx_d, 0, HTX_HE_HARD_ERROR, msg);
            return(-1);
        }

        pir = getPir();
        l_p[i] = pir ;

       	rc = bindprocessor(BINDPROCESS, getpid(), PROCESSOR_CLASS_ANY);
        if(rc == -1) {
            sprintf( msg, "\n%d: bindprocessor failed with %d while unbinding, rc = %d, i = %d ",__LINE__,  errno, rc, i);
			hxfmsg(&htx_d, 0, HTX_HE_HARD_ERROR, msg);
            return(-1);
        }
    }
#else
	FILE *fp;
	char command[200],fname[256];
	int rad, lcpu, nrads, num_procs;

	strcpy(fname,htx_d.htx_exer_log_dir);
	sprintf(fname,"%s/node_details.%d",fname,getpid());
    /*sprintf(command,"/usr/lpp/htx/etc/scripts/get_node_details.sh "
            "> %s\n",fname);*/
    strcpy(command,getenv("HTXSCRIPTS"));
    sprintf(command, "%s/get_node_details.sh > %s\n", command, fname);

    if ( (rc = system(command)) == -1 ) {
            sprintf(msg, "sytem command to get_node_details failed with %d",rc);
            hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
        	return(-1);
    }
    if ((fp=fopen(fname,"r"))==NULL){
            sprintf(msg, "fopen of file %s failed with errno=%d",fname,errno);
            hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
        	return(-1);
    }

    /* Get total number of chips */
    rc = fscanf(fp,"num_nodes=%d\n",&nrads);
    if (rc == 0 || rc == EOF) {
            sprintf(msg, "fscanf of num_nodes on file %s failed with errno =%d",fname,errno);
            hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
            return(-1);
    }
    for (rad = 0; rad < nrads; rad++) {
            int cpu_index = 0;
            int cur_chip = -1; /* Current chip */
            /* Fetch the current chip and the num procs in the chip */
            rc = fscanf(fp,"node=%d,cpus_in_node=%d,cpus",&cur_chip,&num_procs);
            if (rc == 0 || rc == EOF) {
                 sprintf(msg, "fscanf: chip =%d,Fetching of cpus in chip error from"
                        " file %s failed with errno =%d",rad,fname,errno);
                 hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
                 return(-1);
            }

            if ( num_procs > tot_cpus ) {
                sprintf(msg, "num_procs %d in this chip cannot be more than max procs %d "
                        ,num_procs,tot_cpus);
                hxfmsg(&htx_d,0,HTX_HE_HARD_ERROR, msg);
                return(-1);
            }

           /*
            * To find the actual processors (logical cpu Ids that can be
            * specified in an rset):
            */
            cpu_index = 0 ;

            while ( cpu_index < num_procs) {
                rc = fscanf(fp,":%d",&lcpu);
                if ( rc == 0 || rc == EOF) {
                    sprintf(msg, "fscanf: cpu fetch for chip=%d caused error from "
                                 " file %s failed with errno =%d",rad,fname,errno);
                    hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
                    return(-1);
                }
				/* Bind to lcpu and get the PIR value for it */
				rc = htx_bind_process(BIND_THE_PROCESS, lcpu);
				if(rc == -1) {
		            sprintf(msg, "\n bindprocessor failed with %d, binding cpu=%d", errno, lcpu);
            		hxfmsg(&htx_d, errno, HTX_HE_HARD_ERROR, msg);
             		return(-1);
        		}

                l_p[lcpu] = get_cpu_id(lcpu);
				rc = htx_unbind_process();
				if(rc == -1) {
					sprintf(msg, "\n bindprocessor failed with %d, unbinding th=%d, cpu=%d", errno, lcpu);
					hxfmsg(&htx_d, errno, HTX_HE_HARD_ERROR, msg);
					return(-1);
				}

				DEBUGON("l_p[%d]=%d\n",lcpu, l_p[lcpu]);
                cpu_index++;
            }
            rc = fscanf(fp,"\n");
            if (rc == EOF) {
                   sprintf(msg, "fscanf: expecting new line character at the end of"
                                " node %d data reading from file %s failed with errno =%d",\
                                rad,fname,errno);
                   hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
                   return(-1);
            }
     }

#endif
	/* Intialize the sysconf data structure */
	for(node = 0; node < MAX_NODES; node++) {
		for(chip = 0; chip < MAX_CHIPS_PER_NODE; chip ++) {
			for(proc = 0; proc < MAX_CPUS_PER_CHIP; proc ++) {
				physical_scfg.node[node].chip[chip].lprocs[proc] = -1;
			}
			physical_scfg.node[node].chip[chip].num_procs = 0;
		}
		physical_scfg.node[node].num_chips = 0;
	}
	physical_scfg.num_nodes = 0 ;

    i = 0 ;
   	while(i < MAX_CPUS) {
		if(l_p[i] == NO_CPU_DEFINED)  {
			i++;
			continue;
		}
        if(pvr == PVR_POWER9_NIMBUS){
            node = P9_NIMBUS_GET_NODE(l_p[i]);
            chip = P9_NIMBUS_GET_CHIP(l_p[i]);
        } else if(pvr == PVR_POWER9_CUMULUS){
            node = P9_CUMULUS_GET_NODE(l_p[i]);
            chip = P9_CUMULUS_GET_CHIP(l_p[i]);
        } else if(pvr == PVR_POWER8_MURANO || pvr == PVR_POWER8_VENICE || pvr == PVR_POWERP8P_GARRISION) {
			node = P8_GET_NODE(l_p[i]);
			chip = P8_GET_CHIP(l_p[i]);
    	} else if(pvr == PVR_POWER7 || pvr == PVR_POWER7PLUS) {
        	node = P7_GET_NODE(l_p[i]);
        	chip = P7_GET_CHIP(l_p[i]);
    	} else if(pvr == PVR_POWER6) {
			node = P6_GET_NODE(l_p[i]);
			chip = P6_GET_CHIP(l_p[i]);
		} else {
			sprintf(msg, "\n We shldnt have been here pvr = %x,  PVR mismatch. Exiting !!\n", pvr);
            hxfmsg(&htx_d, 0, HTX_HE_HARD_ERROR, msg);
            return(-1);
		}
		DEBUGON("Node=%d,Chip%d,proc=%d\n",node,chip,i);
       	physical_scfg.node[node].chip[chip].lprocs[physical_scfg.node[node].chip[chip].num_procs++] = i ;
       	i++;
    }

	for(i = 0; i < MAX_NODES; i ++) {
		for( j = 0; j < MAX_CHIPS_PER_NODE; j++) {
			if(physical_scfg.node[i].chip[j].num_procs > 0) {
				physical_scfg.node[i].num_chips ++;
			}
		}
		if(physical_scfg.node[i].num_chips > 0) {
			physical_scfg.num_nodes ++;
		}
	}

	/* Copy the system configuration to scfg */
	for(node = 0; node < MAX_NODES; node++) {
		if(physical_scfg.node[node].num_chips == 0)
			continue;
		chips_per_node = 0;
		for(chip = 0; chip < MAX_CHIPS_PER_NODE; chip ++) {

			if(physical_scfg.node[node].chip[chip].num_procs == 0)
				continue;
			memcpy(&scfg->node[num_nodes].chip[chips_per_node], &physical_scfg.node[node].chip[chip], sizeof(CHIP));
			chips_per_node++;
		}
		if(chips_per_node != physical_scfg.node[node].num_chips) {
			sprintf(msg, "%s: Something Wrong !!! Node = %d, chips_per_node = %d, physical_scfg_chip = %d \n",
													 __FUNCTION__,node, chips_per_node, physical_scfg.node[node].num_chips) ;
			hxfmsg(&htx_d, 0, HTX_HE_HARD_ERROR, msg);
            return(-1);
        }
		scfg->node[num_nodes].num_chips = physical_scfg.node[node].num_chips;
		num_nodes++;
	}
	if(num_nodes != physical_scfg.num_nodes) {
		sprintf(msg, "%s: Something Wrong !!! Num_nodes = %d, physical_num_nodes = %d \n",
										__FUNCTION__, num_nodes, physical_scfg.num_nodes);
		hxfmsg(&htx_d, 0, HTX_HE_HARD_ERROR, msg);
        return(-1);
    }

	scfg->num_nodes = physical_scfg.num_nodes;

    return 0 ;
}
Example #8
0
int
fill_random_buffer(unsigned long long size, unsigned long long ** seg_addr, MEMORY_SET * mem)  {


    size_t shm_size;
    char msg[4096];
    int shm_id, rc = 0;
    unsigned int memflg;
    unsigned long long *addr_8, *end_addr, *addr;
	unsigned long long i , j ;

#ifndef __HTX_LINUX__ /* AIX Specific */ 

   	psize_t psize = 16*M;
    struct shmid_ds shm_buf = { 0 };
	
	memflg = (IPC_CREAT | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
	if(SET_PAGESIZE) { 
		memflg |= (SHM_LGPAGE | SHM_PIN);
    	psize = 16*M;
	} else { 
		psize = 4 * K; 
	} 
#else	/* Linux Specific */ 
	unsigned long long psize;

    memflg = (IPC_CREAT | IPC_EXCL |SHM_R | SHM_W);
	if(SET_PAGESIZE) { 
		memflg |= (SHM_HUGETLB);
		psize = 16*M;
	} else { 
		psize = 4 * K; 
	} 
#endif 

    shm_size = size;


    shm_id = shmget(IPC_PRIVATE, shm_size , memflg);
    if(shm_id == -1) {
          sprintf(msg,"shmget failed with %d !\n", errno);
          hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
          return(-1);
    }

#ifndef __HTX_LINUX__
	if( SET_PAGESIZE) {  
	    if ( shm_size > 256*M) {
    	  if ((rc = shmctl(shm_id, SHM_GETLBA, &shm_buf)) == -1)   {
        	    sprintf(msg,"\n shmctl failed to get minimum alignment requirement - %d", errno);
            	hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
            	return(-1);
       		}
    	}
    	shm_buf.shm_pagesize = psize;
    	if( (rc = shmctl(shm_id, SHM_PAGESIZE, &shm_buf)) == -1) {
         	sprintf(msg,"\n shmctl failed with %d while setting page size.",errno);
         	hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
         	return(-1);
    	}
	} 	
#endif
    addr = (unsigned long long *) shmat(shm_id, 0, 0);
    if(-1 == (int)addr) {
        sprintf(msg,"\n shmat failed with %d",errno);
        hxfmsg(&htx_d, -1,HTX_HE_HARD_ERROR, msg);
        memory_set_cleanup();
        return(-1);
    }
    addr_8 = (unsigned long long *)addr;
    end_addr = (unsigned long long *) ((char *)addr + shm_size);
	DEBUGON("%s: addr_8 = %llx , end_addr = %llx \n",__FUNCTION__, addr_8, end_addr);
    for(; addr_8 < end_addr; ) {
        *addr_8 = get_random_number();
        addr_8++;
    }

	/* Lock the new shared memory, so that its always memory resident */
	rc = mlock(addr, shm_size);
	if(rc == -1) {
		sprintf(msg,"\n mlock failed with %d", errno);
		hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
		memory_set_cleanup();
		return(-1);
	}

	mem->seg_addr = (char *)addr ;
	mem->shm_id = shm_id ;
	mem->memory_set_size = size;
	*seg_addr = (unsigned long long *)addr ;
    return 0;
}
Example #9
0
int
get_cont_phy_mem(unsigned int num_cpus_mapped, unsigned int memory_mapping[][2], long long size, MEMORY_SET mem[]) {

    char *p, *addr, msg[4096];
    int i=0, ii, rc, host_cpu , j;
    size_t shm_size;
    unsigned int cpu, bind_to_cpu;
    unsigned int memflg;

#ifndef __HTX_LINUX__ /* AIX Specific */

    psize_t psize = 16*M;
    struct shmid_ds shm_buf = { 0 };
	struct vminfo_psize vminfo_64k = { 0 }; 

    memflg = (IPC_CREAT | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
    if(SET_PAGESIZE) {
        psize = 16*M;
    } else {
        psize = 4 * K;
    }
#else   /* Linux Specific */
    unsigned long long psize;

    memflg = (IPC_CREAT | IPC_EXCL |SHM_R | SHM_W);
    if(SET_PAGESIZE) {
        memflg |= (SHM_HUGETLB);
        psize = 16*M;
    } else {
        psize = 4 * K;
    }

    /* shmmax controls the maximum amount of memory to be allocated for shared memory */
    rc = system ("echo 268435456 > /proc/sys/kernel/shmmax");
    if (rc < 0){
        sprintf(msg,"unable to change the /proc/sys/kernel/shmmax variable\n");
        hxfmsg(&htx_d, 0, HTX_HE_INFO, msg);
    }

    /* The maximum amount of shared memory that can be allocated. */
    rc = system ("echo 268435456 > /proc/sys/kernel/shmall");
    if (rc < 0) {
        sprintf(msg,"unable to change the /proc/sys/kernel/shmall");
        hxfmsg(&htx_d, 0, HTX_HE_INFO, msg);
    }
#endif


    DEBUGON("\n Need %llx physically contiguous memory \n", size);

    shm_size = (size < PG_SZ_16M ? PG_SZ_16M : size);

    for(cpu = 0; cpu < num_cpus_mapped; cpu ++) {

    	if(memory_mapping[cpu][DEST_CPU] != NO_CPU_DEFINED) {
            host_cpu = memory_mapping[cpu][HOST_CPU];
            bind_to_cpu = memory_mapping[cpu][DEST_CPU];
        } else {
            continue;
        }
#ifdef __HTX_LINUX__
	    rc = htx_bind_process(BIND_THE_PROCESS, bind_to_cpu);
#else
   		rc = bindprocessor(BINDPROCESS, getpid(), bind_to_cpu);
#endif
        if(rc == -1) {
            sprintf(msg, "\n bindprocessor failed with %d, binding th=%d, cpu=%d", errno, cpu,bind_to_cpu);
            hxfmsg(&htx_d, errno, HTX_HE_HARD_ERROR, msg);
            return(-1);
        }

        mem[host_cpu].shm_id = shmget(IPC_PRIVATE, shm_size, memflg);
        if(mem[host_cpu].shm_id == -1) {
            memory_set_cleanup();
            sprintf(msg,"shmget failed with %d !\n", errno);
            hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
            return(-1);
        }

#ifndef __HTX_LINUX__
	if(SET_PAGESIZE) {  
        if ( shm_size > 256*M) {
            if ((rc = shmctl(mem[host_cpu].shm_id, SHM_GETLBA, &shm_buf)) == -1)   {
                memory_set_cleanup();
                sprintf(msg,"\n shmctl failed to get minimum alignment requirement - %d", errno);
                hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
                return(-1);
            }
        }
        shm_buf.shm_pagesize = psize;
        if( (rc = shmctl(mem[host_cpu].shm_id, SHM_PAGESIZE, &shm_buf)) == -1) {
            memory_set_cleanup();
            sprintf(msg,"\n shmctl failed with %d while setting page size.",errno);
            hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
            return(-1);
        }
	}
#endif
        addr = (char *) shmat(mem[host_cpu].shm_id, 0, 0);
        if(-1 == (int)addr) {
            sprintf(msg,"\n shmat failed with %d",errno);
            hxfmsg(&htx_d, -1,HTX_HE_HARD_ERROR, msg);
            memory_set_cleanup();
            return(-1);
        }

        /* to be on safer side write touch the remote memory obtained */
        char * mem_addr = addr;
        for(i=0; i < (shm_size/psize); i++) {
            *(unsigned long long *)mem_addr = 0xFFFFffffFFFFffff ; 
            mem_addr += psize;
        }

        sprintf(msg, "%s: cpu %d, bound to cpu %d, seg_addr = 0x%llx of size = 0x%llx\n",
									__FUNCTION__, host_cpu, bind_to_cpu, (unsigned long long *)addr, shm_size);
        hxfmsg(&htx_d, 0, HTX_HE_INFO, msg);

		/* Lock the new shared memory, so that its always memory resident */ 
        rc = mlock(addr, shm_size);
        if(rc == -1) {
            sprintf(msg,"\n mlock failed with %d", errno);
            hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, msg);
            memory_set_cleanup();
            return(-1);
        }

        mem[host_cpu].seg_addr = addr;
		mem[host_cpu].memory_set_size = shm_size; 

#ifdef __HTX_LINUX__
	   	rc = htx_unbind_process();
#else
    	rc = bindprocessor(BINDPROCESS, getpid(), PROCESSOR_CLASS_ANY);
#endif
        if(rc == -1) {
            sprintf(msg, "\n%d: bindprocessor failed with %d while unbinding",__LINE__,  errno);
            hxfmsg(&htx_d, errno, HTX_HE_HARD_ERROR, msg);
            return(-1);
        }
    } /* Off num_cpus_mapped loop */
    return(0);
}
Example #10
0
int
configure_memory_allocation(SYS_CONF_TYP * scfg, unsigned int mem_alloc, unsigned int memory_mapping[][2], unsigned int * num_cpus_mapped, unsigned int threads_per_node, 
							unsigned long long num_pages_available, unsigned long long fabbus_requested, unsigned int pvr, unsigned int query_memconf, unsigned int query_pages) {

    char msg[4096];
    /*
     * cpu_node keeps nodes vs logical procs configurations.
     * cpu_chip keeps chip vs logical procs configurations.
     * This is filled by reading PIR register of each physical processor.
     * -1 indicates no logical cpu on that place.
     */
	 int cpu_sys[MAX_NODES][MAX_CHIPS][MAX_CPUS_PER_CHIP];
     int cpu_node[MAX_NODES][MAX_CPUS_PER_NODE];
     int cpu_chip[MAX_CHIPS][MAX_CPUS_PER_CHIP];

    /*
     * scfg_node maintains no of logical cpus on every node.
     * scfg_chip maintains no of logical cpus on every chip.
     */
     int scfg_sys[MAX_NODES][MAX_CHIPS],scfg_node[MAX_NODES], scfg_chip[MAX_CHIPS];

    /*
     * num_nodes : total number of nodes in system.
     * num_chips : total number of chips in system.
     * chips_per_node[] : number of chips available in each node
     */
     int num_nodes, num_chips;
     int chips_per_node[MAX_NODES] = {0};
     unsigned int i, j,k;
     int node, cpu, pjmp, chip, cpus_mapped = 0;

    /* Intialize local variables */
    num_nodes = num_chips = 0;
    memset(scfg_node, 0, MAX_NODES * sizeof(unsigned int));
    memset(chips_per_node, 0, MAX_NODES * sizeof(unsigned int));
    memset(scfg_chip, 0, MAX_CHIPS * sizeof(unsigned int));
	memset(scfg_sys,0,(MAX_NODES * MAX_CHIPS * sizeof(unsigned int)));

	for(i = 0; i < MAX_NODES; i++) {
		for(j = 0; j < MAX_CHIPS; j++) {
			for(k = 0; k<MAX_CPUS_PER_CHIP;k++) {
				cpu_sys[i][j][k] = NO_CPU_DEFINED;
			}
		}
	}
    for(i = 0; i < MAX_NODES; i++) {
        for(j = 0; j < MAX_CPUS_PER_NODE; j++) {
            cpu_node[i][j] = NO_CPU_DEFINED;
            cpu_node[i][j] = NO_CPU_DEFINED;
        }
    }
    for(i = 0; i < MAX_CHIPS; i++) {
        for(j = 0; j<MAX_CPUS_PER_CHIP;j++)  {
            cpu_chip[i][j] = NO_CPU_DEFINED ;
            cpu_chip[i][j] = NO_CPU_DEFINED ;
        }
    }

    /* extract Node/Chip level info from SYS_CONF_TYP structure for InterNode/IntraNode memory mapping */
    num_nodes = scfg->num_nodes ;
    for(node = 0; node < num_nodes; node++) {
        chips_per_node[node] = scfg->node[node].num_chips;
        for(chip = 0; chip < chips_per_node[node]; chip++) {
            scfg_chip[num_chips] = scfg->node[node].chip[chip].num_procs;
			scfg_sys[node][chip] = scfg->node[node].chip[chip].num_procs;
            for(cpu = 0; cpu < scfg_chip[num_chips]; cpu ++) {
                cpu_chip[num_chips][cpu] = scfg->node[node].chip[chip].lprocs[cpu];
                cpu_node[node][scfg_node[node]] = scfg->node[node].chip[chip].lprocs[cpu];
				cpu_sys[node][chip][cpu]	= scfg->node[node].chip[chip].lprocs[cpu];
                scfg_node[node]++;
            }
            num_chips++;
        }
    }
	if(query_pages ==0 && query_memconf == 0) { 
    	if(num_pages_available < fabbus_requested) {
        	/* System is falling short of 16M pages, We need to equally distribute these pages amongst nodes/chips */
        	unsigned long long memory_set_size = 0, pages_per_rad;
        	if(mem_alloc == 3 ) {
            	pages_per_rad = num_pages_available / num_nodes;
        	} else if(mem_alloc == 4) {
              	pages_per_rad = num_pages_available / num_chips;
        	} else {
              	pages_per_rad = MAX_CPUS;
        	}
        	memory_set_size = memory_per_thread(pvr);
			if(SET_PAGESIZE) { 
        		threads_per_node = ( pages_per_rad * 16 * M) / memory_set_size ;
			} else { 
				threads_per_node = ( pages_per_rad * 4 * K ) / memory_set_size ; 
			}
        	if(threads_per_node < 1) {
            	sprintf(msg," System is too short to create one thread per node/chip, num_pages_available=%#llx, pages_per_rad = %#x, memory_set_size = %#x, threads_per_node = %#x, SET_PAGESIZE=%#x this instance will exit...\n",
                                 num_pages_available, pages_per_rad, memory_set_size, threads_per_node, SET_PAGESIZE);
            	hxfmsg(&htx_d, 0, HTX_HE_HARD_ERROR, msg);
            	return(-1);
        	}
    	}
	}

	if((mem_alloc == 3) && (num_nodes < 2)) {
		sprintf(msg,"Only one CEC node detected num_nodes= %d, insufficient hardware to run inter node fabric bus test. Atleast two CEC nodes are needed on system \n",
						num_nodes);
        hxfmsg(&htx_d, 0, HTX_HE_HARD_ERROR, msg);
		return(-1);
	}
    switch(mem_alloc) {

    	case 0 : { /* Local */
            for(node = 0; node < num_nodes; node++) {
                pjmp = scfg_node[node]/threads_per_node;
                if(pjmp == 0) pjmp = 1;
                for(cpu = 0; cpu < scfg_node[node]; cpu += pjmp) {
                    memory_mapping[cpus_mapped][HOST_CPU] = cpu_node[node][cpu];
                    memory_mapping[cpus_mapped][DEST_CPU] = cpu_node[node][cpu];
                    cpus_mapped++;
                }
            }
        }
        break;
        case 1 : { /* Remote */
            for(node = 0; node < num_nodes; node++) {
                int x, y;
                pjmp = scfg_node[node]/threads_per_node;
                if(pjmp == 0) pjmp = 1;
                x = (node + 1) % num_nodes;
                for(cpu = 0, y = 0; cpu < scfg_node[node]; cpu += pjmp, y += pjmp) {
                    if(cpu_node[x][y] == NO_CPU_DEFINED ) {
                    	if(pjmp > 1) {
                        	y = 1;
                        	cpu -= pjmp;
                        	continue;
                    	} else {
                        	break;
                    	}
                	}
                	memory_mapping[cpus_mapped][HOST_CPU] = cpu_node[node][cpu];
                	memory_mapping[cpus_mapped][DEST_CPU] = cpu_node[x][y];
                	cpus_mapped++;
            	}
        	}
        }
        break;
        case 2 : { /* Remote Spreaded */
            for(node = 0; node < num_nodes; node++) {
                int x, y = 0, exhausted = -1;
                int cnt_thrds = 0 ;
                pjmp = scfg_node[node]/threads_per_node;
                if(pjmp == 0) pjmp = 1;
                x = node;
                for(cpu = 0; cpu < scfg_node[node]; cpu += pjmp) {
                    cnt_thrds ++ ;
                    if ( cnt_thrds > threads_per_node )
                        break ;
                     x = (x + 1) % num_nodes;
                     if(x == node) {
                     	x = (x + 1) % num_nodes;
                     	y++;
                     }
                     if(y >= scfg_node[x]) {
                     	if(exhausted == -1) exhausted = x;
                     	else if (x == exhausted) break;
                       	cpu -= pjmp;
                       	continue;
                     } else {
                     	exhausted = -1;
                     }
                    memory_mapping[cpus_mapped][HOST_CPU] = cpu_node[node][cpu];
                    memory_mapping[cpus_mapped][DEST_CPU] = cpu_node[x][y];
                    cpus_mapped++;
              	}
            }
        }
        break;
        case 3: { /* Remote Spreaded  - all */
			for(node = 0; node < num_nodes; node++) {
				int remote_node, remote_cpu = 0,remote_chip=0;
				int thread_per_chip = threads_per_node/chips_per_node[node];
				for(chip = 0; chip<chips_per_node[node];chip++,remote_chip++){
					remote_cpu  = 0;
					remote_node = node;
					for(cpu=0;cpu < ((scfg_sys[node][chip] < thread_per_chip)? scfg_sys[node][chip]:thread_per_chip);cpu++){
						remote_node = (remote_node + 1) % num_nodes;
						if(remote_node == node) {
							remote_node = (remote_node + 1) % num_nodes;
							remote_cpu++;
						}			
						
						if(chip > chips_per_node[remote_node]){
							remote_chip = (chips_per_node[remote_node] - 1);	
						}
							
						if(remote_cpu >= thread_per_chip){
							continue;
						}
						if(remote_cpu >= scfg_sys[remote_node][remote_chip]){
							memory_mapping[cpus_mapped][HOST_CPU] = cpu_sys[node][chip][cpu];
							memory_mapping[cpus_mapped][DEST_CPU] = cpu_sys[remote_node][remote_chip][scfg_sys[remote_node][remote_chip]-1];
						}else {
							
							memory_mapping[cpus_mapped][HOST_CPU] = cpu_sys[node][chip][cpu];
							memory_mapping[cpus_mapped][DEST_CPU] = cpu_sys[remote_node][remote_chip][remote_cpu];
						}
						cpus_mapped++;
					}
				}
			}
        }
        break;
        case 4 : { /* Intra Node memory mapping */
            int chip_cnt = 0;
            for(node = 0; node < num_nodes; node++) {
            	int remote_chip, remote_cpu = 0, exhausted = -1;

            	if( chips_per_node[node] < 2 ) {
					chip_cnt += chips_per_node[node] ;
                	continue;
            	}
            	for(chip = 0; chip < chips_per_node[node]; chip++) {
                	remote_chip = chip;
					remote_cpu = 0;
                	for(cpu = 0 ; cpu < ((scfg_chip[chip_cnt + chip] < threads_per_node) ? scfg_chip[chip_cnt + chip] : threads_per_node) ; cpu++ ) {
        	        	remote_chip = (remote_chip + 1) % chips_per_node[node];
                   		if(remote_chip == chip) {
                        	remote_chip = (remote_chip + 1) % chips_per_node[node];
                        	remote_cpu++;
                    	}
                        if(remote_cpu >= threads_per_node) {
                            continue;
						}
                    	if( remote_cpu >= scfg_chip[remote_chip]) {
							memory_mapping[cpus_mapped][HOST_CPU] = cpu_chip[chip_cnt + chip][cpu];
							memory_mapping[cpus_mapped][DEST_CPU] = cpu_chip[chip_cnt + remote_chip][scfg_chip[remote_chip] - 1];
                    	} else {
                    		memory_mapping[cpus_mapped][HOST_CPU] = cpu_chip[chip_cnt + chip][cpu];
                    		memory_mapping[cpus_mapped][DEST_CPU] = cpu_chip[chip_cnt + remote_chip][remote_cpu];
						}
                    	cpus_mapped++;
                	}
            	}
            	chip_cnt += chips_per_node[node] ;
            }
        }
        break;
        default : {
        	sprintf(msg," Wrong rules file parm memory_allocation type =%d \n",mem_alloc);
            hxfmsg(&htx_d, 0, HTX_HE_HARD_ERROR, msg);
            return(-1);
        }
    } /* Off Switch */
    *num_cpus_mapped = cpus_mapped;
#ifdef DEBUGON
    sprintf(msg," num_cpus_mapped = %d \n",cpus_mapped);
    hxfmsg(&htx_d, 0, HTX_HE_INFO, msg);
    for(j = 0; j < cpus_mapped; j++) {
        sprintf(msg,"cpu - %d memory on - %d \n",memory_mapping[j][HOST_CPU], memory_mapping[j][DEST_CPU]);
        hxfmsg(&htx_d, 0, HTX_HE_INFO, msg);
    }
#endif
	return 0;
}
Example #11
0
int get_rule(FILE *fd, int *line, struct rule_format * r_ptr)
{
   	char            error;			/* global error flag                */
   	char            lerror;			/* field error flag                 */
   	char            keywd[80];		/* keyword buffer                   */
   	char            s[200];			/* rules file line buffer           */
   	char            ss[5][80];		/* buffer for operands              */
   	int             first_line;		/* line # of 1st stanza keyword     */
   	int             i;				/* loop counter                     */
   	int             keywd_count;	/* keyword count                    */
   	int             rc;				/* return code                      */
   	int		   		LoadDefFlag; 	/* Only load defaults once ea stanza*/
   	int             Stanza1Flag; 	/* First stanza?                    */
	char 			msg_text [1024]; 
	struct htx_data * stats = (struct htx_data *)&htx_ds;
	
	/****************************************************************************/
	/* The hardware parameters can only be set once.  If multiple HW values are */
	/* in the rule file, the last value will be used.                           */
	/****************************************************************************/
   	if(*line == 0) {
      	SetHwDefaults(r_ptr);
      	Stanza1Flag = 1;
   	}
   	else {
      	Stanza1Flag = 0;
   	}
   	LoadDefFlag = 1;
   	keywd_count = 0;
   	error  = 'n';
   	lerror = 'n';
   	first_line = *line + 1;
   	while ((get_line(fd, s, 200)) > 1) {
      	/* We don't want to disturb settings on a  blank line         */
      	if(LoadDefFlag) {
         	LoadDefFlag = 0;
         	SetStanzaDefaults(r_ptr);
      	}
      	*line = *line + 1;
      	if (s[0] == '*')
	 		continue;
      	for (i = 0; s[i] != '\n'; i++) {
		 	if (s[i] == '=')
	    		s[i] = ' ';
      	}				/* endfor */
      	keywd_count++;
      	sscanf(s, "%s", keywd);
      	for(i=0;i < (int)strlen(keywd);i++)
	 		keywd[i] = (char) toupper((int) keywd[i]);

   		if ((strcmp(keywd, "RULE_ID")) == 0) {
 			sscanf(s, "%*s %s", r_ptr->rule_id);
 			if ((strlen(r_ptr->rule_id)) > 8) {
    			sprintf(msg_text, "line# %d %s = %s (must be 8 characters or less)\n", *line, keywd, r_ptr->rule_id);
    			hxfmsg(stats, HERINFO1, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
 			}			/* endif */
   		} else if ((strcmp(keywd, "PATTERN_ID")) == 0) {
			sscanf(s, "%*s %s", r_ptr->pattern_id);
 			if ((strlen(r_ptr->pattern_id)) > 8 || Stanza1Flag == 0) {
    			sprintf(msg_text, "line# %d %s = %s (must be 8 characters or less) FIRST STANZA ONLY.\n", *line, keywd, r_ptr->pattern_id);
    			hxfmsg(stats, HERINFO2, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
       		}
   		} else if ((strcmp(keywd, "COMNET_NAME")) == 0) {
 			sscanf(s, "%*s %s", r_ptr->ComName);
 			if ((strlen(r_ptr->ComName)) > HXECOM_HOSTNAMELEN || Stanza1Flag == 0) {
    			sprintf(msg_text, "line# %d %s = %s (must be %d characters or less) FIRST STANZA ONLY.\n", *line, keywd, r_ptr->ComName, HXECOM_HOSTNAMELEN);
    			hxfmsg(stats, HERINFO3, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
       		}
   		} else if ((strcmp(keywd, "TESTNET_NAME")) == 0) {
 			sscanf(s, "%*s %s", r_ptr->TestNetName);
 			if ((strlen(r_ptr->TestNetName)) > HXECOM_HOSTNAMELEN || Stanza1Flag == 0) {
    			sprintf(msg_text, "line# %d %s = %s (must be %d characters or less) FIRST STANZA ONLY.\n", *line, keywd, r_ptr->TestNetName, HXECOM_HOSTNAMELEN);
    			hxfmsg(stats, HERINFO3, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
       		}
   		} else if ((strcmp(keywd, "LAYER")) == 0) {
 			sscanf(s, "%*s %s", ss[0]);
       		for(i=0;i < (int)strlen(ss[0]);i++)
    			ss[0][i] = (char) toupper((int) ss[0][i]);
       		if(strcmp(ss[0], "UDP") == 0 && Stanza1Flag == 1) {
       			r_ptr->layer = UDP_LAYER;
       		}
       		else if(strcmp(ss[0], "TCP") == 0 && Stanza1Flag == 1) {
       			r_ptr->layer = TCP_LAYER;
       		}
       		else if(strcmp(ss[0], "RDMA") == 0 && Stanza1Flag == 1) {
       			r_ptr->layer = RDMA_LAYER;
				printf("RDMA_LAYER selected = %d\n", r_ptr->layer);
       		}
 			else {
    			sprintf(msg_text, "line# %d %s = %s (must be UDP or TCP)  FIRST STANZA ONLY.\n",*line, keywd, ss[0]);
    			hxfmsg(stats, HERINFO4, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
       		}
   		} else if ((strcmp(keywd, "COM_STREAM_PORT")) == 0) {
 			sscanf(s, "%*s %hu", &(r_ptr->ComPortStream));
 			if (r_ptr->ComPortStream < 5000 || Stanza1Flag == 0) {
    			sprintf(msg_text, "line# %d %s = %hu (must be greater than 5000) FIRST STANZA ONLY.\n",*line, keywd, r_ptr->ComPortStream);
    			hxfmsg(stats, HERINFO5, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
 			}			/* endif */
   		} else if ((strcmp(keywd, "COM_DGRAM_PORT")) == 0) {
 			sscanf(s, "%*s %hu", &(r_ptr->ComPortDgram));
 			if (r_ptr->ComPortDgram < 5000 || Stanza1Flag == 0) {
    			sprintf(msg_text, "line# %d %s = %hu (must be greater than 5000) FIRST STANZA ONLY.\n", *line, keywd, r_ptr->ComPortDgram);
    			hxfmsg(stats, HERINFO6, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
			}			/* endif */
   		} else if ((strcmp(keywd, "COM_RDMA_PORT")) == 0) {
 			sscanf(s, "%*s %hu", &(r_ptr->ComPortDapl));
 			if (r_ptr->ComPortDapl < 5000 || Stanza1Flag == 0) {
    			sprintf(msg_text, "line# %d %s = %hu (must be greater than 5000) FIRST STANZA ONLY.\n",*line, keywd, r_ptr->ComPortStream);
    			hxfmsg(stats, HERINFO5, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
 			}			/* endif */
			printf("COM_RDMA_PORT = 0x%x\n", r_ptr->ComPortDapl);
   		} else if ((strcmp(keywd, "REPLICATES")) == 0) {
 			sscanf(s, "%*s %hu", &(r_ptr->replicates));
 			if (r_ptr->replicates < 1 || r_ptr->replicates >50 || Stanza1Flag == 0) {
    			sprintf(msg_text, "line# %d %s = %hu (must be >= 1 and <=50) FIRST STANZA ONLY.\n", *line, keywd, r_ptr->replicates);
    			hxfmsg(stats, HERINFO7, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
 			}			/* endif */
   		} else if ((strcmp(keywd, "BUFMIN")) == 0) {
 			sscanf(s, "%*s %hu", &(r_ptr->bufmin));
 			if (r_ptr->bufmin < 1) {
    			sprintf(msg_text, "line# %d %s = %hu (must be 1 or greater) \n", *line, keywd, r_ptr->bufmin);
    			hxfmsg(stats, HERINFO9, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
 			}			/* endif */
   		} else if ((strcmp(keywd, "BUFMAX")) == 0) {
 			sscanf(s, "%*s %hu", &(r_ptr->bufmax));
 			if (r_ptr->bufmax < 1) {
    			sprintf(msg_text, "line# %d %s = %hu (must be 1 or greater) \n", *line, keywd, r_ptr->bufmax);
    			hxfmsg(stats, HERINFO10, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
 			}			/* endif */
   		} else if ((strcmp(keywd, "BUFINC")) == 0) {
 			sscanf(s, "%*s %hi", &(r_ptr->bufinc));
 			if (r_ptr->bufinc < -1) {
    			sprintf(msg_text, "line# %d %s = %hu (must be -1 or greater) \n", *line, keywd, r_ptr->bufinc);
    			hxfmsg(stats, HERINFO11, HTX_HE_SOFT_ERROR, msg_text);
    			error = 'y';
 			}			/* endif */
		} else if((strcmp(keywd, "BUFSEED")) == 0) { 
			sscanf(s, "%*s %hu", &(r_ptr->bufseed));
			if (r_ptr->bufseed < 1 || Stanza1Flag == 0) {	
				sprintf(msg_text, "line# %d %s = %hu (must be 0 or greater) FIRST STANZA ONLY. \n", *line, keywd, r_ptr->bufseed);
				hxfmsg(stats, HERINFO11, HTX_HE_SOFT_ERROR, msg_text);
				error = 'y';
			} 
   		} else if ((strcmp(keywd, "ACK_TRIG")) == 0)  {
 			sscanf(s, "%*s %hu", &(r_ptr->ack_trig));
			/*	 if (r_ptr->ack_trig < 0) {
    				sprintf(msg_text,
		   				"line# %d %s = %hu (must be 0 or greater) \n",
		   				*line, keywd, r_ptr->ack_trig);
   					hxfmsg(stats, HERINFO12, HTX_HE_SOFT_ERROR, msg_text);
	    			error = 'y';
	 			}
		     */
      	} else if ((strcmp(keywd, "NUM_OPER")) == 0) {
	 		sscanf(s, "%*s %hu", &(r_ptr->num_oper));
	 		if (r_ptr->num_oper < 1) {
	    		sprintf(msg_text, "line# %d %s = %hu (must be 1 or greater) \n", *line, keywd, r_ptr->num_oper);
	    		hxfmsg(stats, HERINFO13, HTX_HE_SOFT_ERROR, msg_text);
	    		error = 'y';
	 		}			/* endif */
      	} else if ((strcmp(keywd, "WRITE_AHEAD")) == 0) {
	 		sscanf(s, "%*s %hu", &(r_ptr->write_ahead));
	 		if (r_ptr->write_ahead < 1 || r_ptr->write_ahead > ACK_MAX) {
	    		sprintf(msg_text, "line# %d %s = %hu (must be > 1 and <= %d) \n", *line, keywd, r_ptr->write_ahead, ACK_MAX); 
	    		hxfmsg(stats, HERINFO14, HTX_HE_SOFT_ERROR, msg_text);
	    		error = 'y';
	 		}			/* endif */
      	} else if ((strcmp(keywd, "ONESYS")) == 0) {
			sscanf(s, "%*s %hu", &(r_ptr->onesys));
		 	if (r_ptr->onesys < 0 || r_ptr->onesys > 1) {
				sprintf(msg_text, "line# %d %s = %hu (must be 0 or 1) \n", *line, keywd, r_ptr->onesys);
				hxfmsg(stats, HERINFO14, HTX_HE_SOFT_ERROR, msg_text);
				error = 'y';
		 	}			/* endif */
      	} else if ((strcmp(keywd, "DEBUG_PATTERN")) == 0) {
			sscanf(s, "%*s %hu", &(r_ptr->debug_pattern));
		 	if (r_ptr->debug_pattern < 0 || r_ptr->debug_pattern > 1) {
				sprintf(msg_text, "line# %d %s = %hu (must be 0 or 1) \n", *line, keywd, r_ptr->debug_pattern);
				hxfmsg(stats, HERINFO14, HTX_HE_SOFT_ERROR, msg_text);
				error = 'y';
		 	}			/* endif */
      	} else if ((strcmp(keywd, "NO_COMPARE")) == 0) {
			sscanf(s, "%*s %hu", &(r_ptr->no_compare));
		 	if (r_ptr->no_compare < 0 || r_ptr->no_compare > 1) {
				sprintf(msg_text, "line# %d %s = %hu (must be 0 or 1) \n", *line, keywd, r_ptr->no_compare);
				hxfmsg(stats, HERINFO14, HTX_HE_SOFT_ERROR, msg_text);
				error = 'y';
		 	}			/* endif */
      	} else if ((strcmp(keywd, "WRITE_SLEEP")) == 0) {
	 		sscanf(s, "%*s %d", &i);
         	r_ptr->write_sleep = 0xffff & i;
	 		if (i < 0) {
	    		sprintf(msg_text, "line# %d %s = %d (must be >= 0) \n", *line, keywd, i);
	    		hxfmsg(stats, HERINFO15, HTX_HE_SOFT_ERROR, msg_text);
	    		error = 'y';
	 		}			/* endif */
      	} else if ((strcmp(keywd, "IO_ALARM_TIME")) == 0) {
	 		sscanf(s, "%*s %d", &i);
         	r_ptr->alarm = 0xffff & i;
	 		if (i < 0) {
	    		sprintf(msg_text, "line# %d %s = %d (must be >= 0) \n", *line, keywd, i);
	    		hxfmsg(stats, HERINFO16, HTX_HE_SOFT_ERROR, msg_text);
	    		error = 'y';
	 		}			/* endif */
      	} else if ((strcmp(keywd, "SHUTDOWN_FLAGS")) == 0) {
	 		sscanf(s, "%*s %hx", &(r_ptr->shutdown));
	 		if (r_ptr->shutdown < 0) {
	    		sprintf(msg_text, "line# %d %s = %d (must be >= 0).\nShutdown flag should be positive value. Check hxecom.readme for possible values.\n", *line, keywd, r_ptr->shutdown); 
	    		hxfmsg(stats, HERINFO17, HTX_HE_SOFT_ERROR, msg_text);
	    		error = 'y';
	 		}
      	} else if ((strcmp(keywd, "MASTER")) == 0) {
	 		ss[0][0] = '\0';
	 		sscanf(s, "%*s %s", ss[0]);
	 		switch (ss[0][0]) {
	 			case '\0':
           			break;
	 			case 'Y':
         		case 'y':
	    			r_ptr->transact |= MASTER_VAL;
           			break;
	 			case 'N':
         		case 'n':
	    			r_ptr->transact &= ~((u_short)MASTER_VAL);
	    			break;
	 			default:
	    			lerror = 'y';
	    			break;
	 		}			/* endswitch */
         	if(lerror == 'y' || Stanza1Flag == 0) {
	    		sprintf(msg_text, "line# %d %s = %s (value must be Y(yes) or N(no)) FIRST STANZA ONLY.\n", *line, keywd, ss[0]);
	    		hxfmsg(stats, HERINFO18, HTX_HE_SOFT_ERROR, msg_text);
           		error  = 'y';
           		lerror = 'n';
         	}
      	} else if ((strcmp(keywd, "TCP_NODELAY")) == 0) {
	 		ss[0][0] = '\0';
	 		sscanf(s, "%*s %s", ss[0]);
	 		switch (ss[0][0]) {
	 			case '\0':
           			break;
	 			case 'Y':
         		case 'y':
	    			r_ptr->transact |= TCP_NODELAY_VAL;
           			break;
	 			case 'N':
         		case 'n':
	    			r_ptr->transact &= ~((u_short)TCP_NODELAY_VAL);
	    			break;
	 			default:
	    			lerror = 'y';
	    			break;
	 		}			/* endswitch */
         	if(lerror == 'y' || Stanza1Flag == 0) {
	    		sprintf(msg_text, "line# %d %s = %s (value must be Y(yes) or N(no)) FIRST STANZA ONLY (%d).\n", *line, keywd, ss[0], Stanza1Flag);
	    		hxfmsg(stats, HERINFO18, HTX_HE_SOFT_ERROR, msg_text);
           		error  = 'y';
           		lerror = 'n';
         	}
      	} else if ((strcmp(keywd, "SO_LINGER")) == 0) {
	 		ss[0][0] = '\0';
	 		sscanf(s, "%*s %s", ss[0]);
	 		switch (ss[0][0]) {
	 			case '\0':
           			break;
	 			case 'Y':
         		case 'y':
	    			r_ptr->transact |= SO_LINGER_VAL;
           			break;
	 			case 'N':
         		case 'n':
	    			r_ptr->transact &= ~((u_short)SO_LINGER_VAL);
	    			break;
	 			default:
	   				lerror = 'y';
	    			break;
	 		}			/* endswitch */
         	if(lerror == 'y' || Stanza1Flag == 0) {
	    		sprintf(msg_text, "line# %d %s = %s (value must be Y(yes) or N(no)) FIRST STANZA ONLY (%d).\n", *line, keywd, ss[0], Stanza1Flag); 
	    		hxfmsg(stats, HERINFO18, HTX_HE_SOFT_ERROR, msg_text);
           		error  = 'y';
           		lerror = 'n';
         	}
      	} else if ((strcmp(keywd, "OPER")) == 0) {
	 		sscanf(s, "%*s %s", ss[0]);
	 		if (Stanza1Flag == 0 || (strcmp(ss[0],"R") != 0 && strcmp(ss[0], "W") != 0 && strcmp(ss[0], "RW") != 0
              						 && strcmp(ss[0], "WR") != 0)) {
	    		sprintf(msg_text, "line# %d %s = %s (must be \"R\", \"W\", \"RW\", or \"WR\") FIRST STANZA ONLY.\n", *line, keywd, ss[0]);
	    		hxfmsg(stats, HERINFO1, HTX_HE_SOFT_ERROR, msg_text);
	    		error = 'y';
	 		}
         	else {
           		if(ss[0][0] == 'R' || ss[0][1] == 'R')
           			r_ptr->transact |= READ_VAL;
           		else
           			r_ptr->transact &= ~((u_short)READ_VAL);
           		if(ss[0][0] == 'W' || ss[0][1] == 'W')
              		r_ptr->transact |= WRITE_VAL;
            	else
               		r_ptr->transact &= ~((u_short)WRITE_VAL);
         	}
       } else {
	 		sprintf(msg_text, "line# %d keywd = %s (invalid) \n",
						*line, keywd);
	 		hxfmsg(stats, HERINFO19, HTX_HE_SOFT_ERROR, msg_text);
	 		error = 'y';
      	}				/* endif */
   	}				/* endwhile */
   	*line = *line + 1;
   	if (keywd_count > 0) {
   		if (r_ptr->rule_id[0] == '\0') {
 			sprintf(msg_text, "line# %d rule_id not specified \n", first_line);
 			hxfmsg(stats, HERINFO20, HTX_HE_SOFT_ERROR, msg_text);
 			rc = 1;
   		} else { 
 			rc = 0;
		}
   		if(r_ptr->bufinc == USHRT_MAX)
   			r_ptr->bufinc = 1;
  	 	if(r_ptr->bufmin == USHRT_MAX)
   			r_ptr->bufmin = r_ptr->bufmax = 100;
   		if(r_ptr->bufmax == USHRT_MAX)
   			r_ptr->bufmax = r_ptr->bufmin;
   		if(r_ptr->ack_trig == USHRT_MAX)
   			r_ptr->ack_trig = r_ptr->write_ahead -1;

   		if(error == 'n' && r_ptr->bufmin > r_ptr->bufmax) {
   			sprintf(msg_text, "BUFMIN = %d, BUFMAX = %d, BUFINC = %d, Invalid combination.\n",
             				r_ptr->bufmin, r_ptr->bufmax, r_ptr->bufinc);
   			hxfmsg(stats, HERINFO21, HTX_HE_SOFT_ERROR, msg_text);
   			error = 'y';
    	}	
	   	if(error == 'n' && r_ptr->bufmin < r_ptr->bufmax && r_ptr->bufinc == 0) {
   			sprintf(msg_text, "BUFMIN = %d, BUFMAX = %d, BUFINC = %d, Invalid combination.\n",
              					r_ptr->bufmin, r_ptr->bufmax, r_ptr->bufinc);
   			hxfmsg(stats, HERINFO22, HTX_HE_SOFT_ERROR, msg_text);
   			error = 'y';
   		}
		/****************************************************************************/
		/* We have just added OPER rule.  To make backward compatible for rules     */
 		/* that don't specify OPER -- if Master, OPER=RW. if not master, OPER=W.    */
		/****************************************************************************/
    	if(error == 'n' && (r_ptr->transact & (WRITE_VAL | READ_VAL)) == 0) {
       		if(r_ptr->transact & MASTER_VAL == 0)
           		r_ptr->transact |= WRITE_VAL;
       		else
           		r_ptr->transact |= (WRITE_VAL | READ_VAL);
   		}
   		if(error != 'y' && Stanza1Flag == 1 && (strcmp(r_ptr->ComName, "") == 0 || strcmp(r_ptr->TestNetName, "") == 0)) {
      		sprintf(msg_text, "COMNET_NAME and TESTNET_NAME must be specified.\n");
      		hxfmsg(stats, HERINFO22, HTX_HE_SOFT_ERROR, msg_text);
      		error = 'y';
   		}
   		if (error == 'y') {
      		rc = 1;
   		}
	} else { 
		rc = EOF; 
	}	
   	return (rc);
}				/* get_rule() */
Example #12
0
/*
 * Function to cleanup the the page (4K, 64K, 16M) pool shared memory
 */
int iomm_cleanup_page_pool(int free_index, long psize)
{
    int rc, index = -1, free_count = 0, i;
    struct buf_node *tmp = NULL, *bn = NULL;
    char *shm_start_addr;

    PRINT(("IN %s: freeing the buf nodes for page size = 0x%lx\n", __FUNCTION__, psize))

    /* check free index for psize */
    for(i = 0; i < NUM_BUF_SIZES; i++) {
        if (buflist[i].page_size == psize) {
            index = i;
            break;
        }
    }

    PRINT(("index = %d, free_index = %d\n", index, free_index))

    if (index == -1 || index != free_index) {
        sprintf(htx_d.msg_text,"IN %s: Large Page Pool Not Found", __FUNCTION__);
        hxfmsg(&htx_d, -1, HTX_HE_HARD_ERROR, htx_d.msg_text);
        return -1;
    }

    PRINT(("IN %s: index = %d, shm_start_addr = %p\n", __FUNCTION__, index, buflist[index].shm_start_addr))
    shm_start_addr = buflist[index].shm_start_addr;

	if (shm_start_addr) {
    	PRINT(("IN %s: Calling shmdt for addr = %p\n", __FUNCTION__, shm_start_addr))
    	rc = shmdt(shm_start_addr);
    	if (rc != 0) {
        	sprintf(htx_d.msg_text,"%s: shmdt failed with %d", __FUNCTION__, errno);
        	hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, htx_d.msg_text);
        	return(-1);
    	}
	}


    if (buflist[index].shm_id != 0) {
        rc = shmctl(buflist[index].shm_id, IPC_RMID, (struct shmid_ds *)NULL);
        if (rc != 0) {
            sprintf(htx_d.msg_text,"%s: shmctl for IPC_RMID failed with %d",__FUNCTION__, errno);
            hxfmsg(&htx_d, rc, HTX_HE_HARD_ERROR, htx_d.msg_text);
            return(-1) ;
        }
        buflist[index].shm_id = 0 ;
    }

    buflist[index].num_free = 0;
    buflist[index].num_elements = 0;
    buflist[index].size = 0;
    buflist[index].page_size = 0;
    buflist[index].shm_id = 0;
    buflist[index].shm_pool = 0;

    for(bn = buflist[index].free, free_count = 0; bn;) {
        tmp = bn;
        bn = bn->next;
        free(tmp);
        free_count++;
    }

    PRINT(("%d nodes of free list freed\n", free_count))
    PRINT(("Freeing inuse list\n"))

    for(bn = buflist[index].inuse, free_count = 0; bn;) {
        tmp = bn;
        bn = bn->next;
        free(tmp);
        free_count++;
    }

    PRINT(("%d nodes of inuse list freed\n", free_count))
    PRINT(("OUT %s: done\n", __FUNCTION__))
	return (0);
}
Example #13
0
int
get_rule(struct htx_data *phtx_info, struct ruleinfo *prule_info,
         char *rules_name)
{
  int          keywd_count, rc=0, i, d, k, found;
  int          first_line;
  char         *p, digit[3] = "   ", keywd[80], pipe_swtch[3], t[200];
  char         error, s[200], msg[221], tmp_msg[100];
  static int   line = 0;

    set_defaults(prule_info);
    keywd_count = 0;
    cnt = 0;
    error = 'n';
    first_line = line + 1;
    while ( (get_line(s, 200)) > 1 ) {     /* read in & process the next line */
      line = line + 1;
      if ( s[0] == '*' )
         continue;
      for ( i = 0; s[i] != '\n'; i++ ) {
         t[i] = s[i];
         s[i] = toupper(s[i]);
         if (s[i] == '=')
            s[i] = ' ';
      }
      keywd_count++;
      sscanf(s, "%s", keywd);
      if ( (strcmp(keywd, "RULE_ID")) == 0 ) {            /* Valid RULE_ID ? */
         sscanf(s, "%*s %s", prule_info->rule_id);
         if ( (strlen(prule_info->rule_id)) > 8 ) {
            sprintf(msg, "line# %d %s = %s (must be 8 characters or less) \n",
                    line, keywd, prule_info->rule_id);
            hxfmsg(phtx_info, 0, SYSERR, msg);
            error = 'y';
         } else {
            d = strlen(prule_info->rule_id);
            i = 0;
            found = 0;
            for ( k = 0; k < d; k++ ) {
               if ( isdigit(prule_info->rule_id[k]) ) {
                  digit[i] = prule_info->rule_id[k];
                  i++;
                  found = 1;
               }
            }
            if ( found ) {
               rule_stanza[cnt] = atoi(digit);
               for ( i = 0; i < cnt; i++ ) {
                  if ( rule_stanza[cnt] == rule_stanza[i] ) {
                     sprintf(msg, "line# %d %s = %s (Duplicate Stanza "
                                  "number found in RULE_ID) \n",
                              line, keywd, prule_info->rule_id);
                     hxfmsg(phtx_info, 0, SYSERR, msg);
                     error = 'y';
                  }
               }
            } else {
               sprintf(msg, "line# %d %s = %s (NO Stanza number found "
                            "in RULE_ID) \n",
                       line, keywd, prule_info->rule_id);
               hxfmsg(phtx_info, 0, SYSERR, msg);
               error = 'y';
            }
         }
      } else if ( (strcmp(keywd, "PATTERN_ID")) == 0 ) {/* Valid PATTERN_ID ? */
         sscanf(s, "%*s %s", prule_info->pattern_id);
         if ( (strlen(prule_info->pattern_id)) > 8 ) {
            sprintf(msg, "line# %d %s = %s (must be 8 characters or less) \n",
                    line, keywd, prule_info->pattern_id);
            hxfmsg(phtx_info, 0, SYSERR, msg);
            error = 'y';
         }
      } else if ( (strcmp(keywd, "NUM_OPER")) == 0 ) {   /* Valid NUM_OPER ? */
         sscanf(s, "%*s %d", &prule_info->num_oper);
         if ( prule_info->num_oper < 0 ) {
            sprintf(msg, "line# %d %s = %d (must be >= 0) \n",
                    line, keywd, prule_info->num_oper);
            hxfmsg(phtx_info, 0, SYSERR, msg);
            error = 'y';
         }
      } else if ( (strcmp(keywd, "OPER")) == 0 ) {           /* Valid OPER ? */
         sscanf(s, "%*s %s", prule_info->oper);
         if ( strcmp(prule_info->oper, "W") == 0     ||
              strcmp(prule_info->oper, "R") == 0     ||
              strcmp(prule_info->oper, "RC") == 0    ||
              strcmp(prule_info->oper, "D") == 0     ||
              strcmp(prule_info->oper, "RW") == 0    ||
              strcmp(prule_info->oper, "WEOF") == 0  ||
              strcmp(prule_info->oper, "S") == 0     ||
              strcmp(prule_info->oper, "E") == 0     ||
              strcmp(prule_info->oper, "SF") == 0    ||
              strcmp(prule_info->oper, "SR") == 0    ||
              strcmp(prule_info->oper, "CO") == 0    ||
              strcmp(prule_info->oper, "WEOT") == 0  ||
              strcmp(prule_info->oper, "C") == 0     ||
              strcmp(prule_info->oper, "O") == 0     ||
              strcmp(prule_info->oper, "RCEOT") == 0 ||
              strcmp(prule_info->oper, "REOT") == 0  ||          /* dgs */
              strcmp(prule_info->oper, "RS") == 0    ||
#ifndef __HTX_LINUX__
              strcmp(prule_info->oper, "DBUG") == 0  ||
              strcmp(prule_info->oper, "IE") == 0    ||
              strcmp(prule_info->oper, "RES") == 0   ||
              strcmp(prule_info->oper, "ML") == 0    ||
              strcmp(prule_info->oper, "MUL") == 0   ||
              strcmp(prule_info->oper, "ASF") == 0   ||
              strcmp(prule_info->oper, "ASR") == 0   ||
              strcmp(prule_info->oper, "LB") == 0    ||
              strcmp(prule_info->oper, "RP") == 0    ||
              strcmp(prule_info->oper, "ADUL") == 0  ||
              strcmp(prule_info->oper, "TWIE") == 0  ||
              strcmp(prule_info->oper, "TWPE") == 0  ||
              strcmp(prule_info->oper, "TWRE") == 0  ||
              strcmp(prule_info->oper, "TWUL") == 0  ||
              strcmp(prule_info->oper, "WUL") == 0   ||
              strcmp(prule_info->oper, "TWMM") == 0  ||
              strcmp(prule_info->oper, "CDRE") == 0  ||
              strcmp(prule_info->oper, "CDMM") == 0  ||
              strcmp(prule_info->oper, "HUNL") == 0  ||
              strcmp(prule_info->oper, "HINI") == 0  ||
              strcmp(prule_info->oper, "HREL") == 0  ||
              strcmp(prule_info->oper, "HWUN") == 0  ||
	          strcmp(prule_info->oper, "SPEC") == 0  ||
#endif
              strcmp(prule_info->oper, "VBSWR") == 0 ||
              strcmp(prule_info->oper, "VBSRD") == 0 ||
              strcmp(prule_info->oper, "VBSRDC") == 0||
                   strcmp(prule_info->oper, "XCMD") == 0 ) ;
         else {
           sprintf(msg, "ERROR in rules file %s:\n", rules_name);
           hxfmsg(phtx_info, 0, INFO, msg);
           sprintf(msg, " Line# %d %s = %s is an INVALID operation.\n",
                   line, keywd, prule_info->oper);
           hxfmsg(phtx_info, 0, INFO, msg);
#ifndef __HTX_LINUX__
           sprintf(msg, " Valid Operations are W,R,RC,D,RW,WEOF,S,E,SF,SR,CO"
                        "WEOT,C,O,RCEOT,\nRS,DBUG,IE,RES,ML,MUL,ASF,ASR,LB"
                        "RP,ADUL,TWIE,TWPE,TWRE,TWUL,\nWUL,TWMM,VBSWR,VBSRD, VBSRDC"
                        "SPEC, XCMD.\n");
#else
		   sprintf(msg, " Valid Operations are W,R,RC,D,RW,WEOF,S,E,SF,SR,CO"
						"WEOT,C,O,RCEOT,\nRS,VBSWR,VBSRD, VBSRDC, XCMD.\n");
#endif
           hxfmsg(phtx_info, 0, SYSERR, msg);
           error = 'y';
         }
      } else if ( (strcmp(keywd, "NUM_BLKS")) == 0 ) {
         sscanf(s, "%*s %d", &prule_info->num_blks);
         if ( strcmp(prule_info->oper,"SF") == 0 ||
              strcmp(prule_info->oper,"SR") == 0 )
            prule_info->pattern_id[0] = 0;
      } else if ( (strcmp(keywd, "#CLOSE_PIPE")) == 0 ) {
         sscanf(s, "%*s %s", pipe_swtch);
         if ( strcmp(pipe_swtch, "NO") == 0 )
            signal_flag = 'R';
         else {
            sprintf(msg, "rm %s", pipe_name);
            system(msg);
            sprintf(msg, "line# %d %s = %s (must be NO) \n",
                    line, keywd, pipe_swtch);
            hxfmsg(phtx_info, 0, SYSERR, msg);
            error = 'y';
         }
      } else if ((strcmp(keywd, "#CRASH_ON_MIS")) == 0) {
         char dummy[30];
		 if(crash_on_mis == 0) {
	         sscanf(s, "%*s %s", dummy);
    	     if      ( strcmp(dummy, "YES") == 0 ) crash_on_mis = 1;
        	 else if ( strcmp(dummy, "NO")  == 0 ) crash_on_mis = 0;
	         else {
    	        sprintf(msg, "rm %s", pipe_name);
        	    system(msg);
            	sprintf(msg,"line# %d %s = %s (must be YES or NO) \n",
                	    line, keywd, dummy);
	            hxfmsg(phtx_info, 0, SYSERR, msg);
    	        error = 'y';
        	 }
		 }
      } else if ( (strcmp(keywd, "#RULES_NAME")) == 0 ) {
         sscanf(s, "%*s %s", rules_name);
         sprintf(msg, "Using New Rules File > %s", rules_name);
         hxfmsg(phtx_info, 0, INFO, msg);
      } else if ( (strcmp(keywd, "UNLOAD_SLEEP")) == 0 ) {
         sscanf(s, "%*s %d", &prule_info->u_sleep);
      } else if ( (strcmp(keywd, "SOURCE_ID")) == 0 ) {
         sscanf(s, "%*s %d", &prule_info->source_id);
      } else if ( (strcmp(keywd, "DEST_ID")) == 0 ) {
         sscanf(s, "%*s %d", &prule_info->dest_id);
      } else if ( (strcmp(keywd, "CHS_FILE")) == 0 ) {
          for ( d = 0; s[d] != '\n'; d++ )
             s[d] = tolower(s[d]);
          sscanf(s, "%*s %s", prule_info->chs_file);
      } else if ( (strcmp(keywd, "SOURCE_ID1")) == 0 ) {
         sscanf(s, "%*s %d", &prule_info->source_id1);
      } else if ( (strcmp(keywd, "DEST_ID1")) == 0 ) {
         sscanf(s, "%*s %d", &prule_info->dest_id1);
      } else if ( strcmp(keywd, "CRASH_ON_MIS") == 0 ) {
         sscanf(s, "%*s %s", msg);
         crash_on_mis = (*msg == 'Y') ? 1 : 0;
      } else if ( strcmp(keywd, "VBS_SEED") == 0 ) {
         sscanf(s, "%*s %n", &i);
         while ( isspace(s[i]) ) i++;
         strcpy(msg, &s[i]);
         if ( strncmp(prule_info->oper, "VBS", 3) != 0 ) {
            sprintf(msg, "line# %d %s = %s (Only valid in VBSRD or VBSWR)",
                    line, keywd, msg);
            hxfmsg(phtx_info, 0, SYSERR, msg);
            error = 'y';
         } else if ( strncmp(msg, "RANDOM", 6) == 0 ) {
            init_seed(prule_info->seed);
            prule_info->VBS_seed_type = 'R';
            VBS_seed_initialized = 1;
         } else if ( strncmp(msg, "FIXED", 5) == 0 ) {
            VBS_seed_initialized = 1;
            prule_info->VBS_seed_type = 'F';
         } else {
            p = msg;
            i = 0;
            while ( *p && i < 4 )                   /* scan for first digit */
               if ( isdigit(*p) ) {
                  if ( i < 3 )
                     prule_info->seed[i++] = atoi(p);  /* convert the arg   */
                  else {
                     VBS_last_write = atoi(p);         /* convert the arg   */
                     i++;
                  }
                  while ( isdigit(*(++p)) ) ;          /* scan past the arg */
               } else
                  p++;
            if ( i != 4 ) {
               sprintf(tmp_msg,
                       "line# %d %s = %s (must be RANDOM or 4 integers)"
                       "/nThe last integer being the # of bytes in the last"
                       "Variable Write command",
                       line, keywd, msg);
               hxfmsg(phtx_info, 0, SYSERR, tmp_msg);
               error = 'y';
            } else {
               VBS_seed_initialized = 1;
               prule_info->VBS_seed_type = 'U';
            }
         }
      } else if ( (strcmp(keywd, "COMMAND")) == 0 ) {
         d = 0;
         for ( i = 10; s[i] != '\n' && s[i] != '\0'; i++, d++ ) {
             prule_info->cmd_list[d] = t[i];
         }
         prule_info->cmd_list[d] = '\0';
      } else {
         sprintf(msg, "line# %d keywd = %s (invalid) \n",
                 line, keywd);
         hxfmsg(phtx_info, 0, SYSERR, msg);
         error = 'y';
      }
    }

    line = line + 1;
    if ( keywd_count > 0 ) {
       if ( (htx_strcmp(prule_info->rule_id, "        ") == 0) &&
            (signal_flag != 'X') && (signal_flag != 'R') ) {
          sprintf(msg, "line# %d rule_id not specified \n",
                  first_line);
          hxfmsg(phtx_info, 0, SYSERR, msg);
          error = 'y';
       } else
          rc = 0;
    } else {
       rc = EOF;
       line = 0;
    }
    if ( error == 'y' )
       rc = 1;
    return(rc);
}
Example #14
0
int
proc_rule(struct htx_data *phtx_info, struct ruleinfo *prule_info,
          char *wbuf, char *rbuf, struct blk_num_typ *pblk_num)
{
  int            dlen, loop, rc;                   
  char           msg[220], path[100];
  unsigned short seed[3];

  rc = 0;
  init_seed(seed);            /* initialize seed for random number generator */
  dlen = prule_info->num_blks * BLK_SIZE;       /* initialize length of data */
                                           /*-------------------------------*/
                                           /* initialize the write buffer   */
                                           /*-------------------------------*/
  if ( (prule_info->pattern_id[0] != '#') && 
       (prule_info->pattern_id[0] != 0) ) {
	 path[0] ='\0';	  
     if ( (int) htx_strlen((char *) htx_strcpy(path, getenv("HTXPATTERNS"))) == 0 )
        htx_strcpy(path, "../pattern/");         /* default ONLY */
     htx_strcat (path, prule_info->pattern_id);
     rc = hxfpat(path, wbuf, dlen);
     if ( rc == 1 ) {
        sprintf(msg, "cannot open pattern file - %s\n", path);
        hxfmsg(phtx_info, 0, SYSERR, msg);
        return(1);
     } 
     if ( rc == 2 ) {
        sprintf(msg, "cannot read pattern file - %s\n", path);
        hxfmsg(phtx_info, 0, SYSERR, msg);
        return(1);
     } 
  } else if ( prule_info->pattern_id[0] == '#' )
     bldbuf((unsigned short*)wbuf, dlen, prule_info->pattern_id, pblk_num);
  pblk_num->in_rule = 0;      /* initialize block number within current rule */
  rc = 0;
  tape_error_code = 0;
  for ( loop = 1; loop <= prule_info->num_oper; loop++ ) {
     if ( strcmp(prule_info->oper, "R") == 0 ) {     
        rc = read_tape(phtx_info, prule_info, loop, pblk_num, rbuf);
     } else if ( strcmp(prule_info->oper, "W") == 0 ) {
        rc = write_tape(phtx_info, prule_info, loop, pblk_num, wbuf);
     } else if ( strcmp(prule_info->oper, "RC") == 0 ) {   
        rc = read_tape(phtx_info, prule_info, loop, pblk_num, rbuf);
        if ( rc >= 0 )     
           rc = cmpbuf(phtx_info, prule_info, loop, pblk_num, wbuf, rbuf);
     } else if ( strcmp(prule_info->oper, "RW") == 0 ) {
        rc = rewind_tape(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "WEOF") == 0 ) { 
        rc = weof_tape(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "SF") == 0 ) {  
        rc = search_file(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "SR") == 0 ) {  
        rc = search_rec(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "D") == 0 ) { 
        rc = diag_tape(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "E") == 0 ) { 
        rc = erase_tape(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "S") == 0 ) { 
        rc = do_sleep(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "CO") == 0 ) { 
        rc = close_open(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "C") == 0 ) { 
        rc = tclose(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "O") == 0 ) {  
        rc = topen(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "WEOT") == 0 ) {
        rc = write_eot(phtx_info, prule_info,loop, pblk_num, wbuf);
     } else if ( strcmp(prule_info->oper, "RCEOT") == 0 ) {
        rc = read_eot(phtx_info, prule_info, loop,pblk_num, wbuf, rbuf);
     } else if ( strcmp(prule_info->oper, "REOT") == 0 ) {  
        rc = read_teot(phtx_info, prule_info, loop, pblk_num, wbuf, rbuf);
     } else if ( strcmp(prule_info->oper, "RS") == 0 ) {  
        rc = prt_req_sense(phtx_info, prule_info, loop, pblk_num);
	 }
#ifndef __HTX_LINUX__		
     else if ( strcmp(prule_info->oper, "ML") == 0 ) { 
        rc = medium_load(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "MUL") == 0 ) {   
        rc = medium_unload(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "RES") == 0 ) {   
        rc = read_status(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "IE") == 0 ) {   
        rc = init_element(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "RP") == 0 ) {  
        rc = read_posit(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "LB") == 0 ) {   
        rc = loc_block(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "ASF") == 0 ) { 
        rc = asearch_file(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "ASR") == 0 ) { 
        rc = asearch_rec(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "ADUL") == 0 ) {  
        rc = write_unload(phtx_info, prule_info, loop, pblk_num, wbuf);
     } else if ( strcmp(prule_info->oper, "TWIE") == 0 ) {  
        rc = twin_tape(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "TWPE") == 0 ) {   
        rc = twps_tape(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "TWRE") == 0 ) {  
        rc = twrd_stat(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "TWMM") == 0 ) { 
        rc = twmv_tape(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "TWUL") == 0 ) {  
        rc = unload_write(phtx_info, prule_info, loop, pblk_num, wbuf);
     } else if ( strcmp(prule_info->oper, "WUL") == 0 ) {   
        rc = tape_unload(phtx_info, prule_info, loop, pblk_num, wbuf);
     } else if ( strcmp(prule_info->oper, "CDRE") == 0 ) {
        rc = cdrd_stat(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "CDMM") == 0 ) {  
        rc = cdmv_tape(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "HUNL") == 0 ) {
        rc = himove(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "HINI") == 0 ) {
        rc = hiinit(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "HREL") == 0 ) {
        rc = hielem(phtx_info, prule_info, loop, pblk_num);
     } else if ( strcmp(prule_info->oper, "HWUN") == 0 ) {
        rc = hidal_unload(phtx_info, prule_info, loop, pblk_num, wbuf);
     } else if ( strcmp(prule_info->oper, "DBUG") == 0 ) {  
       rc = set_dbug(phtx_info, prule_info, pblk_num);
     } 
#endif
	 else if ( strcmp(prule_info->oper, "XCMD") == 0 ) {
       rc = do_cmd(phtx_info, prule_info, pblk_num);
     } else {
        ;
     }
     hxfupdate(UPDATE, phtx_info);
     if ( phtx_info->run_type[0] == 'O' ) {
        info_msg(phtx_info, prule_info, loop, pblk_num, msg);
        hxfmsg(phtx_info, 0, INFO, msg);
     } 
     if ( rc != 0 )
        break;
  } 
  return(rc);
} 
Example #15
0
int proc_rule(struct htx_data *ps, struct ruleinfo *pr, char *wbuf, char *rbuf, unsigned int *last_lba, unsigned int *pblk_size)
{
  int            blkno[3], blkno_save[3]; /* block # ptrs 0-curr,1-up,2-dwn */
  int            rc, i, rc_ptr, save_dlen, loop;
  unsigned short seed[3];
  char           path[100], msg[221], *tbuf, *tbuf_malloc;

  int read_res = -1;

  tbuf_malloc = malloc(TMP_BUF_SIZE + PAGE_SIZE);
  if(tbuf_malloc == NULL) { /* Out of memory? */
     sprintf(msg, "Cannot allocate memory for tbuf: %d bytes\n", TMP_BUF_SIZE + PAGE_SIZE);
     hxfmsg(ps, 0, SYSERR, msg);
     return(1);
  }

#ifndef __HTX_LINUX__     /* AIX */
  tbuf = tbuf_malloc;
#else                     /* Linux */
  /* Page align the tmp buffer for linux raw IO */
  tbuf = (char *)HTX_PAGE_ALIGN(tbuf_malloc);
#endif

  init_seed(seed);                /* init seed for random number generator */
  if ( strcmp(pr->addr_type, "SEQ") == 0 ||         /* init length of data */
       strcmp(pr->type_length, "FIXED") == 0)       /* to be transmitted   */
     pr->dlen = pr->num_blks * pr->bytpsec;
  else
     pr->dlen = random_dlen(pr->bytpsec, pr->tot_blks, seed);
  if ( strcmp(pr->oper, "RC") == 0 ) {      /* init write buff for oper RC */
                                   /* get HTXPATTERNS environment variable */
     strcpy(path, ""); /* Linux will need this initialization */
     if ((char *) getenv("HTXPATTERNS") != NULL) {
                 strcpy(path, (char *) getenv("HTXPATTERNS"));
     } else {
         strcpy(path, "../pattern/");                       /* default ONLY */
     }
     strcat (path, pr->pattern_id);
     rc = hxfpat(path, wbuf, pr->dlen);
     if ( rc == 1 ) {
        sprintf(msg, "Cannot open pattern file - %s\n", path);
        hxfmsg(ps, 0, SYSERR, msg);
        return(1);
     }
     if ( rc == 2 ) {
        sprintf(msg, "Cannot read pattern file - %s\n", path);
        hxfmsg(ps, 0, SYSERR, msg);
        return(1);
     }
  }
  if ( strcmp(pr->addr_type, "SEQ") == 0 )    /* init current block number */
     init_blkno(pr, blkno);
  else
     random_blkno(blkno, pr->dlen, pr->bytpsec, pr->max_blkno, seed,
                  pr->min_blkno);
  for ( i = 0; i < 3; i++ )
      blkno_save[i] = blkno[i];

  for ( loop = 1 ; loop <= pr->num_oper ; loop++ ) {
     if ( strcmp(pr->oper, "MS") == 0 ) {
        ms_get(pr, ps, last_lba, pblk_size);
    } else if ( strcmp(pr->oper, "R") == 0 ) {
        read_cdrom(ps, pr, loop, blkno, rbuf);
    } else if ( strcmp(pr->oper, "RWP") == 0 ) {
        read_write_pattern(ps, pr, loop, blkno, rbuf);
    } else if ( strcmp(pr->oper, "RRC") == 0 ) {
        /*read_cdrom(ps, pr, loop, blkno, wbuf);
        read_cdrom(ps, pr, loop, blkno, rbuf);*/

        if( (read_res = read_cdrom(ps, pr, loop, blkno, wbuf) ) == 0 ) {/* read success */
        	if( (read_res = read_cdrom(ps, pr, loop, blkno, rbuf) ) == 0 ) {/* read success, again */
        		cmpbuf(ps, pr, loop, blkno, wbuf, rbuf); /* safe to compare */
			} else { /* second read fail */
				 sprintf(msg, "read_cdrom() failed in Re-Read sequence of RRC oper\n"
				              "Skipping compare operation\n");
				 prt_msg(ps, pr, loop, blkno, 0, SOFT, msg);
			}
		} else { /* first read fail */
			 sprintf(msg, "read_cdrom() failed in Read sequence of RRC oper\n"
						  "Skipping compare operation\n");
			 prt_msg(ps, pr, loop, blkno, 0, SOFT, msg);
		}

    } else if ( strcmp(pr->oper, "RC") == 0 ) {
        for ( i = 0; i < 3; i++ )
           blkno[i] = blkno_save[i];      /* RC = always start at same blkno */
                       /******************************************************/
                       /*- First, read the successive data blocks into rbuf  -*/
                       /******************************************************/
        save_dlen = pr->dlen;
        rc_ptr = 0;                          /*- init read/compare pointer --*/
        pr->dlen = pr->bytpsec;      /*-- read 1 block at a time into rbuf --*/
        while ( rc_ptr <= pr->num_blks ) {
           /*read_cdrom(ps, pr, loop, blkno, tbuf);*/
           if( ( read_res = read_cdrom(ps, pr, loop, blkno, tbuf) ) != 0 ) /* read un-succesfull ?*/
           		break;

           for ( i = 0; i <= pr->dlen; i++ )
               rbuf[(pr->dlen*rc_ptr)+i] = tbuf[i];
           set_blkno(blkno, pr->direction, pr->increment, 1);
           rc_ptr++;
        }
        if( read_res == 0 ) {/* only if all reads are successful ... */
			pr->dlen = save_dlen;
			cmpbuf(ps, pr, loop, blkno_save, wbuf, rbuf);
		} else { /* read fail */
			 sprintf(msg, "read_cdrom() failed in Read sequence of RC oper\n"
						  "Skipping compare operation\n");
			 prt_msg(ps, pr, loop, blkno, 0, SOFT, msg);
		}

    } else if ( strcmp(pr->oper, "D") == 0 ) {
        diag_cdrom(ps, pr, loop, blkno);
    } else if ( strcmp(pr->oper, "A") == 0 ) {
      #ifndef __HTX_LINUX__
        audio_cdrom(ps, pr, loop, blkno);
      #endif
    } else if ( strcmp(pr->oper, "AMM") == 0 ) {
		if ( (0 != strncmp(device_subclass, "sata", 16)) && (0 != strncmp(device_subclass, "usbif", 16)) ) {
			/* PLAYUDIO MSF is not supported for SATA drives */
        	audio_mm(ps, pr, loop, blkno);
		}
		else {
			sprintf(msg, "Skipping AMM stanza for SATA/USB drive, rule_id = %s\n", pr->rule_id);
       		hxfmsg(ps, 0, INFO, msg);
		}
    } else if ( strcmp(pr->oper, "RS") == 0 ) {
        prt_req_sense(ps, pr, loop, blkno);
    } else if ( strcmp(pr->oper, "S") == 0 ) {
        do_sleep(ps, pr, loop, blkno);
    } else if ( strcmp(pr->oper, "XCMD") == 0 ) {
        rc = do_cmd(ps, pr);
    } else {
        ;
    }

    hxfupdate(UPDATE, ps);
    if ( ps->run_type[0] == 'O' ) {
       info_msg(ps, pr, loop, blkno, msg);
       hxfmsg(ps, 0, INFO, msg);
    }
    if ( strcmp(pr->type_length, "RANDOM") == 0 && /* set lgth of data trans */
         strcmp(pr->addr_type, "RANDOM") == 0 )    /* if random is specified */
       pr->dlen = random_dlen(pr->bytpsec, pr->tot_blks, seed);
    if ( strcmp(pr->addr_type, "RANDOM") == 0 ) /* set block # for next oper */
       random_blkno(blkno, pr->dlen, pr->bytpsec, pr->max_blkno, seed,
                    pr->min_blkno);
    else if ( (strcmp(pr->oper, "RC") != 0 ) /* set blkno if not RC or RWP */
		      && ( strcmp(pr->oper, "RWP") != 0 ))
       set_blkno(blkno, pr->direction, pr->increment, pr->num_blks);
    if ( strcmp(pr->addr_type, "SEQ") == 0 ) {
       rc = wrap(pr, blkno);
       if ( rc == 1 )
          init_blkno(pr,blkno);
    }
  }
  free(tbuf_malloc);
  return(0);
}