Skip to content
Snippets Groups Projects
net.c 24.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • Wolfgang Denk's avatar
    Wolfgang Denk committed
    {
    	return !((NetCksum(ptr, len) + 1) & 0xfffe);
    }
    
    
    unsigned
    NetCksum(uchar * ptr, int len)
    {
    	ulong	xsum;
    
    	xsum = 0;
    	while (len-- > 0)
    		xsum += *((ushort *)ptr)++;
    	xsum = (xsum & 0xffff) + (xsum >> 16);
    	xsum = (xsum & 0xffff) + (xsum >> 16);
    	return (xsum & 0xffff);
    }
    
    
    void
    NetSetEther(volatile uchar * xet, uchar * addr, uint prot)
    {
    	Ethernet_t *et = (Ethernet_t *)xet;
    
    	memcpy (et->et_dest, addr, 6);
    	memcpy (et->et_src, NetOurEther, 6);
    	et->et_protlen = htons(prot);
    }
    
    
    void
    NetSetIP(volatile uchar * xip, IPaddr_t dest, int dport, int sport, int len)
    {
    	volatile IP_t *ip = (IP_t *)xip;
    
    	/*
    	 *	If the data is an odd number of bytes, zero the
    	 *	byte after the last byte so that the checksum
    	 *	will work.
    	 */
    	if (len & 1)
    		xip[IP_HDR_SIZE + len] = 0;
    
    	/*
    	 *	Construct an IP and UDP header.
    			(need to set no fragment bit - XXX)
    	 */
    	ip->ip_hl_v  = 0x45;		/* IP_HDR_SIZE / 4 (not including UDP) */
    	ip->ip_tos   = 0;
    	ip->ip_len   = htons(IP_HDR_SIZE + len);
    	ip->ip_id    = htons(NetIPID++);
    	ip->ip_off   = htons(0x4000);	/* No fragmentation */
    	ip->ip_ttl   = 255;
    	ip->ip_p     = 17;		/* UDP */
    	ip->ip_sum   = 0;
    	NetCopyIP((void*)&ip->ip_src, &NetOurIP); /* already in network byte order */
    	NetCopyIP((void*)&ip->ip_dst, &dest);	   /* - "" - */
    	ip->udp_src  = htons(sport);
    	ip->udp_dst  = htons(dport);
    	ip->udp_len  = htons(8 + len);
    	ip->udp_xsum = 0;
    	ip->ip_sum   = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2);
    }
    
    void copy_filename (uchar *dst, uchar *src, int size)
    {
    	if (*src && (*src == '"')) {
    		++src;
    		--size;
    	}
    
    	while ((--size > 0) && *src && (*src != '"')) {
    		*dst++ = *src++;
    	}
    	*dst = '\0';
    }
    
    #endif /* CFG_CMD_NET */
    
    void ip_to_string (IPaddr_t x, char *s)
    {
        x = ntohl(x);
        sprintf (s,"%d.%d.%d.%d",
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	(int)((x >> 24) & 0xff),
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	(int)((x >> 16) & 0xff),
    	(int)((x >>  8) & 0xff),
    	(int)((x >>  0) & 0xff)
        );
    }
    
    
    IPaddr_t string_to_ip(char *s)
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    {
    	IPaddr_t addr;
    
    	char *e;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	int i;
    
    
    	if (s == NULL)
    		return(0);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    	for (addr=0, i=0; i<4; ++i) {
    		ulong val = s ? simple_strtoul(s, &e, 10) : 0;
    		addr <<= 8;
    		addr |= (val & 0xFF);
    		if (s) {
    			s = (*e) ? e+1 : e;
    		}
    	}
    
    	return (htonl(addr));
    }
    
    
    void print_IPaddr (IPaddr_t x)
    {
        char tmp[16];
    
        ip_to_string(x, tmp);
    
        puts(tmp);
    }
    
    IPaddr_t getenv_IPaddr (char *var)
    {
    	return (string_to_ip(getenv(var)));
    }