int main(int argc, char *argv[])
{
	long len;
	int sockfd;
	struct sockaddr_in ser_addr;
	char **pptr;
	struct hostent *sh;
	struct in_addr **addrs;
	float rate_of_transmission;
	float time_interval;
	FILE* file_pointer;

	if (argc!= 2)
	{
		printf("parameters not match.");
		exit(EXIT_FAILURE);
	}

	if ((sh=gethostbyname(argv[1]))==NULL) {             
		printf("error when gethostbyname");
		exit(EXIT_FAILURE);
	}
	//Create Socket for Operation
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);             
	if (sockfd < 0)
	{
		printf("Error in Creating Socket");
		exit(EXIT_FAILURE);
	}

	addrs = (struct in_addr **)sh->h_addr_list;
	printf("canonical name: %s\n", sh->h_name);
	//Print out socket information
	for (pptr=sh->h_aliases; *pptr != NULL; pptr++)
		printf("the aliases name is: %s\n", *pptr);			
	switch(sh->h_addrtype)
	{
		case AF_INET:
			printf("AF_INET\n");
		break;
		fileSfault:
			printf("unknown addrtype\n");
		break;
	}
	ser_addr.sin_family = AF_INET;
	ser_addr.sin_port = htons(MYUDP_PORT);
	memcpy(&(ser_addr.sin_addr.s_addr), *addrs, sizeof(struct in_addr));
	bzero(&(ser_addr.sin_zero), 8);
	if((file_pointer = fopen ("myfile.txt","r+t")) == NULL)
	{
		printf("File doesn't exist\n");
		exit(EXIT_FAILURE);
	}
	time_interval = transmit_packets(file_pointer, sockfd, (struct sockaddr *)&ser_addr, sizeof(struct sockaddr_in), &len);   
	rate_of_transmission = (len/(float)time_interval);
	printf("Time(ms) : %.3f, Data sent(byte): %d\nData rate: %f (Kbytes/s)\n", time_interval, (int)len, rate_of_transmission);
	close(sockfd);
	exit(EXIT_SUCCESS);
}
示例#2
0
文件: Transmit.c 项目: AllenDou/linux
/**
 * @ingroup tx_functions
 * Transmit thread
 */
int tx_pkt_handler(struct bcm_mini_adapter *Adapter /**< pointer to adapter object*/)
{
	int status = 0;

	while (!kthread_should_stop()) {
		/* FIXME - the timeout looks like workaround for racey usage of TxPktAvail */
		if (Adapter->LinkUpStatus)
			wait_event_timeout(Adapter->tx_packet_wait_queue,
					tx_pending(Adapter), msecs_to_jiffies(10));
		else
			wait_event_interruptible(Adapter->tx_packet_wait_queue,
						tx_pending(Adapter));

		if (Adapter->device_removed)
			break;

		if (Adapter->downloadDDR == 1) {
			Adapter->downloadDDR += 1;
			status = download_ddr_settings(Adapter);
			if (status)
				pr_err(PFX "DDR DOWNLOAD FAILED! %d\n", status);
			continue;
		}

		/* Check end point for halt/stall. */
		if (Adapter->bEndPointHalted == TRUE) {
			Bcm_clear_halt_of_endpoints(Adapter);
			Adapter->bEndPointHalted = FALSE;
			StartInterruptUrb((PS_INTERFACE_ADAPTER)(Adapter->pvInterfaceAdapter));
		}

		if (Adapter->LinkUpStatus && !Adapter->IdleMode) {
			if (atomic_read(&Adapter->TotalPacketCount))
				update_per_sf_desc_cnts(Adapter);
		}

		if (atomic_read(&Adapter->CurrNumFreeTxDesc) &&
			Adapter->LinkStatus == SYNC_UP_REQUEST &&
			!Adapter->bSyncUpRequestSent) {

			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Calling LinkMessage");
			LinkMessage(Adapter);
		}

		if ((Adapter->IdleMode || Adapter->bShutStatus) && atomic_read(&Adapter->TotalPacketCount)) {
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Device in Low Power mode...waking up");
			Adapter->usIdleModePattern = ABORT_IDLE_MODE;
			Adapter->bWakeUpDevice = TRUE;
			wake_up(&Adapter->process_rx_cntrlpkt);
		}

		transmit_packets(Adapter);
		atomic_set(&Adapter->TxPktAvail, 0);
	}

	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Exiting the tx thread..\n");
	Adapter->transmit_packet_thread = NULL;
	return 0;
}
int
send_packets(int *sockfd){
	demand_qnode_data demand;
	cperf_demand ack_packet;
	int32_t interface_index;
	int interface_num = 0;
	//int sockfd = open_socket(interface_num, &interface_index, (int)host_number);
//	int32_t flags = fcntl(sockfd, F_GETFL, 0);
	//fcntl(sockfd, F_SETFL, O_NONBLOCK | flags);
	uint16_t src_mac1  = 0x0001;
  	uint32_t src_mac2  = 0x00000002;
  	uint16_t dest_mac1 = 0x0000;
  	uint32_t dest_mac2 = 0x000002;
  //	uint16_t packet_type = ETH_P_Exp;
	int32_t retval = 0;
	int n;
	demand.src = 0;
	while(1){
		fflush(stdout);
		dequeue_demand(&demand);
		if(demand.src != 0){
		//	printf("\nPackets Sent: Src: %hd    Dest: %hd   Flow: %hd  vlanid: %hd  Port: %hd", demand.src, demand.dest, demand.flow, demand.vlanid, demand.port);
			fprintf(send_pkts_fp, "Transmitting Flow: Timestamp: %d Src: %hd    Dest: %hd   Flow: %hd  vlanid: %hd  Port: %hd\n",demand.timeslot, demand.src, demand.dest, demand.flow, demand.vlanid, demand.port);
		//	transmit_packets(sockfd, interface_index, src_mac1, src_mac2, dest_mac1, dest_mac2, packet_type, demand.vlanid, demand.src, 
		//	demand.dest, demand.port, demand.flow);
			//sleep(1);
		//	transmit_packets();
			//demand.flow = 20;
			//if(demand.port == 5001)
    	//		sleep((float)rand()/pow(10, 10));
			///if(demand.port != 5001){
				//retval = transmit_packets((int32_t)demand.src, (int32_t)demand.dest, (int32_t)demand.port, (int16_t)demand.vlanid, (int32_t)demand.flow);
				//usleep(5000);
			
			// TS finish message
			if(demand.dest == 100 && curr_ts == demand.timeslot){
				fprintf(send_pkts_fp, "Sending Timeslot ACK: Timeslot: %d \n",curr_ts);
				fflush(send_pkts_fp);
				ack_packet.src = host_number; 
				ack_packet.flow = curr_ts; 
				ack_packet.ack = 1; 
				n = write(*sockfd,(void *)&ack_packet, sizeof(host_reply));	
				curr_ts = 0;	
			}else{
			/*	if(prev_dest == demand.dest)
					usleep(50);*/
				curr_ts = demand.timeslot;
				//if(curr_ts == prev_ts || curr_ts == 0){
				retval = transmit_packets((int32_t)demand.src, (int32_t)demand.dest, (int32_t)demand.port, (int16_t)demand.vlanid, (int32_t)demand.flow);
				prev_dest = demand.dest;
				//usleep(50);
				//prev_ts = curr_ts;
			}	
			//}	
		//	if(demand.src == 5001)
		}else{
			// send Ack to arbiter
		/*	if(curr_ts > 0){
				fprintf(send_pkts_fp, "Sending Timeslot ACK: Timeslot: %d \n",curr_ts);
				fflush(send_pkts_fp);
				ack_packet.src = host_number; 
				ack_packet.flow = curr_ts; 
				ack_packet.ack = 1; 
				n = write(*sockfd,(void *)&ack_packet, sizeof(host_reply));	
				curr_ts = 0;
			}*/
			pthread_mutex_lock(&req_qlock);
		//	printf("\n>>>>>>>>> Going In MUTEX QUEUE");
			pthread_cond_wait(&queue_not_empty, &req_qlock);
		//	printf("\n<<<<<<<<<<<COming Out of  MUTEX QUEUE");
			pthread_mutex_unlock(&req_qlock);
		}	
		demand.src = 0;
		fflush(send_pkts_fp);
	}
	return 1;
}
示例#4
0
INT bcm_transmit(struct sk_buff *skb, 		/**< skb */
					struct net_device *dev 	/**< net device pointer */
					)
{
	PMINI_ADAPTER      	Adapter = NULL;
	USHORT				qindex=0;
	struct timeval tv;
	UINT		pkt_type = 0;
	UINT 		calltransmit = 0;   
	INT			status = STATUS_SUCCESS;
	
	BCM_DEBUG_PRINT (Adapter, DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL, "\n%s====>\n",__FUNCTION__);

	memset(&tv, 0, sizeof(tv));
	/* Check for valid parameters */
	if(skb == NULL || dev==NULL) 
	{
	    BCM_DEBUG_PRINT (Adapter, DBG_TYPE_TX,TX_OSAL_DBG, DBG_LVL_ALL, "Got NULL skb or dev\n");
		return -EINVAL;
	}

	Adapter = GET_BCM_ADAPTER(dev);
	if(!Adapter)
	{
		BCM_DEBUG_PRINT (Adapter, DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL, "Got Invalid Adapter\n");
  		status = -EINVAL;
		goto exit_path;
	}
	if(Adapter->device_removed == TRUE || !Adapter->LinkUpStatus)
	{
		if(!netif_queue_stopped(dev)) {
				netif_carrier_off(dev);
				netif_stop_queue(dev);
		}
		status = STATUS_FAILURE;		
		goto exit_path;
	}
	BCM_DEBUG_PRINT (Adapter, DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL, "Packet size : %d\n", skb->len);

	/*Add Ethernet CS check here*/
	if(Adapter->TransferMode == IP_PACKET_ONLY_MODE )
	{
        pkt_type = ntohs(*(PUSHORT)(skb->data + 12));
		/* Get the queue index where the packet is to be queued */	
		BCM_DEBUG_PRINT (Adapter, DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL, "Getting the Queue Index.....");
        
		qindex = GetPacketQueueIndex(Adapter,skb);
			
		if((SHORT)INVALID_QUEUE_INDEX==(SHORT)qindex)
		{
			if(pkt_type == ETH_ARP_FRAME)
			{
				/*
				Reply directly to ARP request packet 
				ARP Spoofing only if NO ETH CS rule matches for it 
				*/
				BCM_DEBUG_PRINT (Adapter,DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL,"ARP OPCODE = %02x",

                (*(PUCHAR)(skb->data + 21)));

                reply_to_arp_request(skb);

                BCM_DEBUG_PRINT (Adapter, DBG_TYPE_TX,TX_OSAL_DBG, DBG_LVL_ALL,"After reply_to_arp_request \n");

			}
			else
			{				
                BCM_DEBUG_PRINT (Adapter, DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL, 
    			"Invalid queue index, dropping pkt\n");
				status = STATUS_FAILURE;
			}
			goto exit_path;
        }

		if(Adapter->PackInfo[qindex].uiCurrentPacketsOnHost >= SF_MAX_ALLOWED_PACKETS_TO_BACKUP)
		{
			atomic_inc(&Adapter->TxDroppedPacketCount);
			status = STATUS_FAILURE;
			goto exit_path;
		}
			
		/* Now Enqueue the packet */
		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "bcm_transmit Enqueueing the Packet To Queue %d",qindex);
		spin_lock(&Adapter->PackInfo[qindex].SFQueueLock);
		Adapter->PackInfo[qindex].uiCurrentBytesOnHost += skb->len;
		Adapter->PackInfo[qindex].uiCurrentPacketsOnHost++;

		*((B_UINT32 *)skb->cb + SKB_CB_LATENCY_OFFSET ) = jiffies;
		ENQUEUEPACKET(Adapter->PackInfo[qindex].FirstTxQueue,
  	                  Adapter->PackInfo[qindex].LastTxQueue, skb);
		atomic_inc(&Adapter->TotalPacketCount);	
		spin_unlock(&Adapter->PackInfo[qindex].SFQueueLock);
		do_gettimeofday(&tv);
        
		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL,"ENQ: \n");
		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL, "Pkt Len = %d, sec: %ld, usec: %ld\n",
		(skb->len-ETH_HLEN), tv.tv_sec, tv.tv_usec);

#ifdef BCM_SHM_INTERFACE			
		spin_lock(&Adapter->txtransmitlock);
		if(Adapter->txtransmit_running == 0)
		{
			Adapter->txtransmit_running = 1;
			calltransmit = 1;
		}
		else
			calltransmit = 0;

		spin_unlock(&Adapter->txtransmitlock);
#endif
		if(calltransmit == 1)
			transmit_packets(Adapter);
		else
		{		
			if(!atomic_read(&Adapter->TxPktAvail))
			{
				atomic_set(&Adapter->TxPktAvail, 1);
#ifdef BCM_SHM_INTERFACE
				virtual_mail_box_interrupt();
#endif
				wake_up(&Adapter->tx_packet_wait_queue);
			}
		}
		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL, "<====");
	}
	else
		status = STATUS_FAILURE;

exit_path:

	if(status != STATUS_SUCCESS)
		bcm_kfree_skb(skb);

	/* It is expected to return the correct status if running in cut-through mode */

	if(Adapter->bNetworkInterfaceRegistered == FALSE)
  		return status;

	/* It is expected to return as Success for Network Stack
	- This will ensure that the packet is owned by the driver which shall free the same*/

	else
		return STATUS_SUCCESS;

}
示例#5
0
/**
@ingroup tx_functions
Transmit thread
*/
int tx_pkt_handler(PMINI_ADAPTER Adapter  /**< pointer to adapter object*/
				)
{

#ifndef BCM_SHM_INTERFACE
	int status = 0;
#endif

	UINT calltransmit = 1;
	BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Entring to wait for signal from the interrupt service thread!Adapter = 0x%lx",(ULONG) Adapter); 
	
	
	while(1)
	{
		if(Adapter->LinkUpStatus){
			wait_event_timeout(Adapter->tx_packet_wait_queue, 
				((atomic_read(&Adapter->TxPktAvail) && 
				(MINIMUM_PENDING_DESCRIPTORS < 
				atomic_read(&Adapter->CurrNumFreeTxDesc)) && 
				(Adapter->device_removed == FALSE))) || 
				(1 == Adapter->uiFirstInterrupt) || kthread_should_stop() 
#ifndef BCM_SHM_INTERFACE
				|| (TRUE == Adapter->bEndPointHalted) 
#endif				
				, msecs_to_jiffies(10));
		}
		else{
			wait_event(Adapter->tx_packet_wait_queue, 
				((atomic_read(&Adapter->TxPktAvail) && 
				(MINIMUM_PENDING_DESCRIPTORS < 
				atomic_read(&Adapter->CurrNumFreeTxDesc)) && 
				(Adapter->device_removed == FALSE))) || 
				(1 == Adapter->uiFirstInterrupt) || kthread_should_stop()
#ifndef BCM_SHM_INTERFACE
				|| (TRUE == Adapter->bEndPointHalted)
#endif
				);
		}
		
		if(kthread_should_stop() || Adapter->device_removed)
		{
			BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Exiting the tx thread..\n");
			Adapter->transmit_packet_thread = NULL;
			return 0;
		}


		if(Adapter->uiFirstInterrupt == 1)
		{
			SetUpTargetDsxBuffers(Adapter);
			BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Seting DSX...\n");
			Adapter->uiFirstInterrupt +=1;
#ifndef BCM_SHM_INTERFACE
			status = download_ddr_settings(Adapter);
			if(status)
				BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "DDR DOWNLOAD FAILED!\n");
#endif
			continue;
		}
#ifndef BCM_SHM_INTERFACE
		//Check end point for halt/stall. 
		if(Adapter->bEndPointHalted == TRUE)
		{
			Bcm_clear_halt_of_endpoints(Adapter);
			Adapter->bEndPointHalted = FALSE;
			StartInterruptUrb((PS_INTERFACE_ADAPTER)(Adapter->pvInterfaceAdapter));
		}		

		if(Adapter->LinkUpStatus && !Adapter->IdleMode)
		{
			if(atomic_read(&Adapter->TotalPacketCount)) 
			{
				update_per_sf_desc_cnts(Adapter);
			}
		}
#endif		
		
		if( atomic_read(&Adapter->CurrNumFreeTxDesc) && 
			Adapter->LinkStatus == SYNC_UP_REQUEST && 
			!Adapter->bSyncUpRequestSent)
		{
			BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Calling LinkMessage");
			LinkMessage(Adapter);
		}

		if((Adapter->IdleMode || Adapter->bShutStatus) && atomic_read(&Adapter->TotalPacketCount))
		{
				BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Device in Low Power mode...waking up");
    			Adapter->usIdleModePattern = ABORT_IDLE_MODE;
				Adapter->bWakeUpDevice = TRUE; 
				wake_up(&Adapter->process_rx_cntrlpkt);
		}

#ifdef BCM_SHM_INTERFACE			
		spin_lock_bh(&Adapter->txtransmitlock);
		if(Adapter->txtransmit_running == 0)
		{
			Adapter->txtransmit_running = 1;
			calltransmit = 1;
		}
		else
			calltransmit = 0;
		spin_unlock_bh(&Adapter->txtransmitlock);
#endif

		if(calltransmit)
			transmit_packets(Adapter);

		atomic_set(&Adapter->TxPktAvail, 0);
	}
	return 0;
}