zoukankan      html  css  js  c++  java
  • uboot arp地址解析

    common/cmd_cache.c

    int do_getmac(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
    {
        //usend d43d7e45371c 192.168.1.134 1234 1234 hhaa
        char ethsrc[6]={0xff ,0xff ,0xff ,0xff ,0xff, 0xff};
        char ethdst[6]={0xff ,0xff ,0xff ,0xff ,0xff, 0xff};
        
        _getmac(argv[3],ethsrc);         
        getmacfromipaddress(argv[1],ethdst,argv[2],ethsrc);
        //printf("%s mac is  %x %x %x %x %x %x
    ",argv[1],eth[0],eth[1],eth[2],eth[3],eth[4],eth[5]);
        
        return 0;
        
    }
    
    U_BOOT_CMD (getmac, 6, 1, do_getmac,
        "getmac destip srcip srceth",
        "[operation type] [device number] [image address] [image size]
    "    
    );
    common/tftp.c
    int global_raw_reveive = 0;
    void getmacfromipaddress(const char*  remoteip, char* remoteeth,const char* ourip,char* oureth)
    {
    		/* and do the ARP request */
    		 IPaddr_t RemoteIP; 
    		  IPaddr_t MyIP; 
    		  RemoteIP=  string_to_ip(remoteip);
    		  MyIP = string_to_ip(ourip);
    		  
    		ArpRequestsend(RemoteIP,oureth,MyIP);
    		global_raw_reveive = 1;
    		eth_rx();
    		global_raw_reveive = 0;
    		// NetRxPacket = inpkt;
    		// NetRxPacketLen = len;
    		//printbuffer((unsigned char*)NetRxPacket,NetRxPacketLen);
    		//_printarp((unsigned char*)NetRxPacket,NetRxPacketLen);
    		return 1;	/* waiting */
    }

    net/net.c
    void ArpRequestsend(IPaddr_t remoteip,char* oureth,IPaddr_t ourip)
    {
    	int i;
    	volatile uchar *pkt;
    	ARP_t *arp;	
    
    	pkt = NetTxPacket;
    	pkt += NetSetEther(pkt, NetBcastAddr, PROT_ARP);
    	arp = (ARP_t *) pkt;
    	arp->ar_hrd = htons(ARP_ETHER);
    	arp->ar_pro = htons(PROT_IP);
    	arp->ar_hln = 6;
    	arp->ar_pln = 4;
    	arp->ar_op = htons(ARPOP_REQUEST);
    	/* source ET addr */
    	memcpy(&arp->ar_data[0], oureth, 6);
    	/* source IP addr */
    	NetWriteIP((uchar *) &arp->ar_data[6], ourip);
    	for (i = 10; i < 16; ++i) {
    		/* dest ET addr = 0 */
    		arp->ar_data[i] = 0;
    	}
    	NetWriteIP((uchar *) &arp->ar_data[16], remoteip);
    	(void) eth_send(NetTxPacket, (pkt - NetTxPacket) + ARP_HDR_SIZE);
    }
    void
    NetReceive(volatile uchar *inpkt, int len)
    {
    	Ethernet_t *et;
    	IP_t	*ip;
    	ARP_t	*arp;
    	IPaddr_t tmp;
    	IPaddr_t src_ip;
    	int	x;
    	uchar *pkt;
    #if defined(CONFIG_CMD_CDP)
    	int iscdp;
    #endif
    	ushort cti = 0, vlanid = VLAN_NONE, myvlanid, mynvlanid;
    
    	debug("packet received.%d
    ", len);
    
    	NetRxPacket = inpkt;
    	NetRxPacketLen = len;
    	et = (Ethernet_t *)inpkt;
    	<span style="color:#FF0000;">if(global_raw_reveive){
    		//global_raw_reveive=0;
    		printpacket((Ethernet_t *)NetRxPacket,len);
    		return;
    	}</span>

    driver/net/cpsw.c
    void printbuffer(unsigned char* buffer, int len)
    {
    	int i;
    	for(i=0;i<len;i++){
    		printf("%2.2x ",buffer[i]);
    		if((i&15)==15)printf("
    ");
    	}
    	printf("
    ");
    }
    #define printhex(a,b) printf(#b##"=%x
    ",a->b);
    void printarp(ARP_t * arp,int len)
    {
        // ushort        ar_hrd;        /* Format of hardware address    */
        // ushort        ar_pro;        /* Format of protocol address    */
        // uchar        ar_hln;        /* Length of hardware address    */
        // uchar        ar_pln;        /* Length of protocol address    */
        // ushort        ar_op;        /* Operation            */
        // uchar        ar_data[0];
         printf("ar_hrd %x
    ",arp->ar_hrd);
         printf("ar_pro %x
    ",arp->ar_pro);
         printf("ar_hln %x
    ",arp->ar_hln);
         printf("ar_pln %x
    ",arp->ar_pln);
         printf("ar_op %x
    ",arp->ar_op);
        printf("mac_src %.2x%.2x%.2x%.2x%.2x%.2x
    ",arp->ar_data[0],arp->ar_data[1],arp->ar_data[2],arp->ar_data[3],arp->ar_data[4],arp->ar_data[5]);    
        printf("ip_src %d %d %d %d
    ",arp->ar_data[6],arp->ar_data[7],arp->ar_data[8],arp->ar_data[9]);
        printf("mac_dst %.2x%.2x%.2x%.2x%.2x%.2x
    ",arp->ar_data[10],arp->ar_data[11],arp->ar_data[12],arp->ar_data[13],arp->ar_data[14],arp->ar_data[15]);
        printf("ip_dst %d.%d.%d.%d
    ",arp->ar_data[16],arp->ar_data[17],arp->ar_data[18],arp->ar_data[19]);
    }
    int printpacket(char* packet,int len)
    {
    // typedef struct {
        // uchar        et_dest[6];    /* Destination node        */
        // uchar        et_src[6];    /* Source node            */
        // ushort        et_protlen;    /* Protocol or length        */
        // uchar        et_dsap;    /* 802 DSAP            */
        // uchar        et_ssap;    /* 802 SSAP            */
        // uchar        et_ctl;        /* 802 control            */
        // uchar        et_snap1;    /* SNAP                */
        // uchar        et_snap2;
        // uchar        et_snap3;
        // ushort        et_prot;    /* 802 protocol            */
    // } Ethernet_t;
        Ethernet_t* eth =(Ethernet_t* )packet;
        //printbuffer((unsigned char*)packet,len);
        
        printf("
    et_dest %.2x%.2x%.2x%.2x%.2x%.2x
    ", eth->et_dest[0],eth->et_dest[1],eth->et_dest[2],eth->et_dest[3],eth->et_dest[4],eth->et_dest[5]);
        printf("et_src %.2x%.2x%.2x%.2x%.2x%.2x
    ", eth->et_src[0],eth->et_src[1],eth->et_src[2],eth->et_src[3],eth->et_src[4],eth->et_src[5]);
        if(isnotvlan()){
            printf("et_protlen %x",eth->et_protlen);
            printf("et_dsap %x
    ",eth->et_dsap);
            printf("et_ssap %x
    ",eth->et_ssap);
            printf("et_ctl %x
    ",eth->et_ctl);
            printf("et_snap1 %x
    ",eth->et_snap1);
            switch(eth->et_protlen){
                case 0x608:
                    printf("PROT_ARP");
                    printarp((ARP_t * )((unsigned char*)eth+ETHER_HDR_SIZE),len-ETHER_HDR_SIZE);
                    break;
                case 0x8:  
                    printf("PROT_IP");
                    //printip((IP_t * )((unsigned char*)eth+ETHER_HDR_SIZE),len-ETHER_HDR_SIZE);
                    break;
                case 0x3680:
                    printf("PROT_RARP");
                    printarp((ARP_t * )((unsigned char*)eth+ETHER_HDR_SIZE),len-ETHER_HDR_SIZE);
                    break;
                case 0x81:
                    printf("PROT_VLAN");
                    break;
            }
            printf("
    ");
        }else{
            VLAN_Ethernet_t *veth = (VLAN_Ethernet_t *)eth;
            // uchar        vet_dest[6];    /* Destination node        */
            // uchar        vet_src[6];    /* Source node            */
            // ushort        vet_vlan_type;    /* PROT_VLAN            */
            // ushort        vet_tag;    /* TAG of VLAN            */
            // ushort        vet_type;    /* protocol type        */        
            printf("vet_vlan_type %x
    ",veth->vet_vlan_type);
            printf("vet_tag %x
    ",veth->vet_tag);
            printf("vet_type %x
    ",veth->vet_type);
            
            return VLAN_ETHER_HDR_SIZE;
        }
    }
    void printip(IP_t* ip,int len)
    {
    // typedef struct {
    	// uchar		ip_hl_v;	/* header length and version	*/
    	// uchar		ip_tos;		/* type of service		*/
    	// ushort		ip_len;		/* total length			*/
    	// ushort		ip_id;		/* identification		*/
    	// ushort		ip_off;		/* fragment offset field	*/
    	// uchar		ip_ttl;		/* time to live			*/
    	// uchar		ip_p;		/* protocol			*/
    	// ushort		ip_sum;		/* checksum			*/
    	// IPaddr_t	ip_src;		/* Source IP address		*/
    	// IPaddr_t	ip_dst;		/* Destination IP address	*/
    	// ushort		udp_src;	/* UDP source port		*/
    	// ushort		udp_dst;	/* UDP destination port		*/
    	// ushort		udp_len;	/* Length of UDP packet		*/
    	// ushort		udp_xsum;	/* Checksum			*/
    // } IP_t;
    	printf("ip_hl_v %x
    ",ip->ip_hl_v);
    	printf("ip_tos %x
    ",ip->ip_tos);
    	printf("ip_len %x
    ",ip->ip_len);
    	printf("ip_id %x
    ",ip->ip_id);
    	printf("ip_off %x
    ",ip->ip_off);
    	printf("ip_ttl %x
    ",ip->ip_ttl);
    	printf("ip_p %x
    ",ip->ip_p);
    	printf("ip_sum %x
    ",ip->ip_sum);
    
    	if(17==ip->ip_p){
    		unsigned char* p1;
    		printf("UDP
    ");		
    		printf("udp_src %x
    ",ip->udp_src);
    		printf("udp_dst %x
    ",ip->udp_dst);
    		printf("udp_len %x
    ",ip->udp_len);
    		printf("udp_xsum %x
    ",ip->udp_xsum);
    		p1 = (unsigned char*)&ip->ip_src;
    		printf("ip_src %d %d %d %d
    ",p1[0],p1[1],p1[2],p1[3]);
    		p1 = (unsigned char*)&ip->ip_dst;
    		printf("ip_dst %d %d %d %d
    ",p1[0],p1[1],p1[2],p1[3]);
    		
    	}else if(1==ip->ip_p){
    		printf("ICMP
    ");		
    	}
    }
    static int cpsw_send(struct eth_device *dev, volatile void *packet, int length)
    {
    	struct cpsw_priv	*priv = dev->priv;
    	void *buffer;
    	int len;
    	int status;
    	int i;
    	<span style="color:#FF0000;">unsigned char* p=(unsigned char*)packet;
    	//Ethernet_t *et = (Ethernet_t *)p;
    	//IP_t *ip = (IP_t *)(p+ETHER_HDR_SIZE);
    	printf("cpsw_send: length=%x
    ",length);
    	//00 0c 29 6a 86 4e
    	// p[0]=0;
    	// p[1]=0xc;
    	// p[2]=0x29;
    	// p[3]=0x6a;
    	// p[4]=0x86;
    	// p[5]=0x4e;
    	printpacket(packet,length);
    	printf("beging send ...
    ");</span>


  • 相关阅读:
    暑假学习笔记(一)——初识Neo4j和APICloud入门
    置信规则库学习记录——1
    博客整理——宣传文案
    博客整理——软件工程实践总结
    博客整理——Alpha版冲刺
    博客整理——事后诸葛亮
    面试被企业拒绝后还有必要再申请吗?
    MapReduce分布式算法
    水题系列二:PhoneNumbers
    水题系列一:Circle
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7141448.html
Copyright © 2011-2022 走看看