uboot的udp发送

common/cmd_cache.c
int do_usend(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    //usend d43d7e45371c 192.168.1.134 1234 1234 hhaa
    char eth[6]={0xd4 ,0x3d ,0x7e ,0x45 ,0x37, 0x1c};
    int dport,sport;
    int len;
    _getmac(argv[1],eth);
    dport = _atoi(argv[3]);
    sport = _atoi(argv[4]);
    len = _strlen(argv[5]);
    printf("mac %x %x %x %x %x %x\n",eth[0],eth[1],eth[2],eth[3],eth[4],eth[5]);
    printf("dst %s\n",argv[2]);
    printf("dport %d sport %d\n",dport,sport);
    printf("string %s\n",argv[5]);
    printf("len=%d\n",len);
    
    udp_send( eth,argv[2] ,dport,sport,argv[5],len);
    printf("do_udptest\n");
    return 0;
    
}

U_BOOT_CMD (usend, 6, 1, do_usend,
    "loadable FPGA image support",
    "[operation type] [device number] [image address] [image size]\n"    
);

 char _ctoi(char c)
{
	if(c>='0'&&c<='9')return c-'0';
	if(c>='a'&&c<='f')return c-'a'+10;
	return 0;
}
int _atoi(char* s)
{
	unsigned int  a=0;
	unsigned int  b=0;
	int i=0;
	while(s[i]){
		a*=10;
		a+=_ctoi(s[i]);
		i++;	
	}
	return a;
}
int _atox(char* s)
{
	unsigned int  a=0;
	unsigned int  b=0;
	int i=0;
	while(s[i]){
		a<<=4;
		a|=_ctoi(s[i]);
		i++;	
		if(i>=8)break;
	}
	return a;
}
int _strlen(char*s)
{
	int i=0;
	while(s[i]){
		i++;
	}
	return i;
}
void _getmac(char* s,char* eth)
{
	unsigned char  a=0;
	int i=0;
	while(s[i]){
		a<<=4;
		a|=_ctoi(s[i]);			
		if((i&1)==1){
			eth[i>>1]=a;
			a=0;			
		}
		i++;
	}
}

common/cmd_net.c

int udp_send (const char* remorteth,const char* remoteip,int remoteport,int thisport,const char* data,int datalength)
{
	
	if (NetLoop_udpsend(remorteth,remoteip, remoteport, thisport, data, datalength)< 0) {
		show_boot_progress (-81);
		return 1;
	}	 
	/* flush cache */
	//flush_cache(load_addr, size);
	return 0; 
}

net/net.c

int
NetLoop_udpsend(const char* remoteeth,const char* remoteip,int remoteport,int thisport,const char* data,int datalength)
{
	bd_t *bd = gd->bd; 

	/* XXX problem with bss workaround */
	
	NetTxPacket = NULL;
	
	NetTryCount = 1;
	if (!NetTxPacket) {
		int	i;
		/*
		 *	Setup packet buffers, aligned correctly.
		 */
		NetTxPacket = &PktBuf[0] + (PKTALIGN - 1);
		NetTxPacket -= (ulong)NetTxPacket % PKTALIGN;
		for (i = 0; i < PKTBUFSRX; i++)
			NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN;
	}
	printf("NetLoop_udpsend 1");
	eth_halt();
 
	if (eth_init(bd) < 0) {
		eth_halt();
		return -1;
	}

restart:
 
	eth_getenv_enetaddr("ethaddr", NetOurEther);
 
	/*
	 *	Start the ball rolling with the given start function.  From
	 *	here on, this code is a state machine driven by received
	 *	packets and timer events.
	 */
	NetInitLoop(TFTP);
	printf("NetLoop_udpsend 2");

	switch (net_check_prereq(TFTP)) {
	case 1:
		/* network not configured */
		eth_halt();
		return -1;
	case 0: 
			udpSend(remoteeth,remoteip, remoteport, thisport,  data, datalength);
			eth_halt();
			break;
	}
	printf("netloop ok\n");
	return 0;
}

net/tftp.c

void
udpSend(const char* remoteeth,const char*remoteip, int remoteport,int thisport, const char* data,int datalength)
{
	volatile uchar *pkt;
	volatile uchar *xp;
	int		len = 0;
	volatile ushort *s;
	 IPaddr_t RemoteIP; 
	  
	  
	 RemoteIP = string_to_ip(remoteip);
	  
	/*
	 *	We will always be sending some sort of packet, so
	 *	cobble together the packet headers now.
	 */
	pkt = NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE;
	memcpy(pkt,data,datalength);
	printf("udpSend 1");

	NetSendUDPPacket(remoteeth, RemoteIP, remoteport,thisport, datalength);
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值