This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Question about unused 'netmask' var in bootp_support.c


I'm working on clearing up some compiler warnings, and one of them is
a warning that the variable 'netmask' is set but never referenced in
bootp_support.c init_net().  The variable in question (netmask) is
declared at line 452, set at line 484, and never referenced (not even
conditionally).

Can I just remove the declaration of netmask at line 452, and remove
line 484 entirely?  Or is this an actual bug because netmask is
supposed to be used for something?

[net/common/current/src/bootp_support.c]

   443	// [Re]initialize the network interface with the info passed from BOOTP
   444	cyg_bool_t
   445	init_net(const char *intf, struct bootp *bp)
   446	{
   447	    struct sockaddr_in *addrp;
   448	    struct ifreq ifr;
   449	    int s=-1;
   450	    int one = 1;
   451	    struct ecos_rtentry route;
   452	    struct in_addr netmask, gateway;
   453	    unsigned int length;
   454	    int retcode = false;
   455	    
   456	    s = socket(AF_INET, SOCK_DGRAM, 0);
   457	    if (s < 0) {
   458	        perror("socket");
   459	        goto out;
   460	    }
   461	
   462	    if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one))) {
   463	        perror("setsockopt");
   464	        goto out;
   465	    }
   466	
   467	    addrp = (struct sockaddr_in *) &ifr.ifr_addr;
   468	    memset(addrp, 0, sizeof(*addrp));
   469	    addrp->sin_family = AF_INET;
   470	    addrp->sin_len = sizeof(*addrp);
   471	    addrp->sin_port = 0;
   472	    addrp->sin_addr = bp->bp_yiaddr;  // The address BOOTP gave us
   473	
   474	    // Must do this temporarily with default route and netmask so that
   475	    // [sub]netmask can be set.
   476	    strcpy(ifr.ifr_name, intf);
   477	    if (ioctl(s, SIOCSIFADDR, &ifr)) {
   478	        perror("SIOCIFADDR");
   479	        goto out;
   480	    }
   481	
   482	    length = sizeof(addrp->sin_addr);
   483	    if (get_bootp_option(bp, TAG_SUBNET_MASK, &addrp->sin_addr,&length)) {
   484	        netmask = addrp->sin_addr;
   485	        if (ioctl(s, SIOCSIFNETMASK, &ifr)) {
   486	            perror("SIOCSIFNETMASK");
   487	            goto out;
   488	        }
   489	        // Must do this again so that [sub]netmask (and so default route)
   490	        // is taken notice of.
   491	        addrp->sin_addr = bp->bp_yiaddr;  // The address BOOTP gave us
   492	        if (ioctl(s, SIOCSIFADDR, &ifr)) {
   493	            perror("SIOCIFADDR 2");
   494	            goto out;
   495	        }
   496	    }
   497	
   498	    length = sizeof(addrp->sin_addr);    
   499	    if (get_bootp_option(bp, TAG_IP_BROADCAST, &addrp->sin_addr,&length)) {
   500	        if (ioctl(s, SIOCSIFBRDADDR, &ifr)) {
   501	            perror("SIOCSIFBRDADDR");
   502	            goto out;
   503	        }
   504	        // Do not re-set the IFADDR after this; doing *that* resets the
   505	        // BRDADDR to the default!
   506	    }
   507	
   508	    ifr.ifr_flags = IFF_UP | IFF_BROADCAST | IFF_RUNNING;
   509	    if (ioctl(s, SIOCSIFFLAGS, &ifr)) {
   510	        perror("SIOCSIFFLAGS");
   511	        goto out;
   512	    }
   513	
   514	    // Set up routing
   515	    length = sizeof(addrp->sin_addr);
   516	    if (get_bootp_option(bp, TAG_GATEWAY, &gateway,&length)) {
   517	        // ...and it's a nonzero address...
   518	        if ( 0 != gateway.s_addr ) {
   519	            memset(&route, 0, sizeof(route));
   520	            addrp->sin_family = AF_INET;
   521	            addrp->sin_port = 0;
   522	            addrp->sin_len = sizeof(*addrp);
   523	            addrp->sin_addr.s_addr = 0; // Use 0,0,GATEWAY for the default route
   524	            memcpy(&route.rt_dst, addrp, sizeof(*addrp));
   525	            addrp->sin_addr.s_addr = 0;
   526	            memcpy(&route.rt_genmask, addrp, sizeof(*addrp));
   527	            addrp->sin_addr = gateway;
   528	            memcpy(&route.rt_gateway, addrp, sizeof(*addrp));
   529	
   530	            route.rt_dev = ifr.ifr_name;
   531	            route.rt_flags = RTF_UP|RTF_GATEWAY;
   532	            route.rt_metric = 0;
   533	
   534	            if (ioctl(s, SIOCADDRT, &route)) {
   535	                diag_printf("Route - dst: %s",
   536	                  inet_ntoa(((struct sockaddr_in *)&route.rt_dst)->sin_addr));
   537	                diag_printf(", mask: %s",
   538	                  inet_ntoa(((struct sockaddr_in *)&route.rt_genmask)->sin_addr));
   539	                diag_printf(", gateway: %s\n",
   540	                  inet_ntoa(((struct sockaddr_in *)&route.rt_gateway)->sin_addr));
   541	                if (errno != EEXIST) {
   542	                    perror("SIOCADDRT 3");
   543	                    goto out;
   544	                }
   545	            }
   546	        }
   547	    }
   548	    retcode = true;
   549	    
   550	#ifdef CYGINT_ISO_DNS
   551	    {
   552	#define MAX_IP_ADDR_LEN 16
   553	        char buf[BP_MAX_OPTION_LEN+1];  
   554	        memset(buf,0,sizeof(buf));
   555	        length = sizeof(buf);
   556	        if (get_bootp_option(bp, TAG_DOMAIN_NAME, buf, &length)) {
   557	            setdomainname(buf, length);
   558	        }
   559	        length = sizeof(buf);
   560	        if (get_bootp_option(bp, TAG_DOMAIN_SERVER, buf, &length)) {
   561	            cyg_dns_res_init((struct in_addr *)buf);
   562	        }
   563	    }
   564	#endif
   565	
   566	#ifdef CYGNUM_NET_SNTP_UNICAST_MAXDHCP
   567	    {
   568	        struct in_addr dhcp_addrs[CYGNUM_NET_SNTP_UNICAST_MAXDHCP];
   569	
   570	        /* Removed any previously registered addresses */
   571	        cyg_sntp_set_servers(NULL, 0);
   572	
   573	        /* See if we received any NTP servers from DHCP */
   574	        length = sizeof(dhcp_addrs);
   575	        if (get_bootp_option(bp, TAG_NTP_SERVER, &dhcp_addrs[0], &length))
   576	        {
   577	                static struct sockaddr ntp_servers[CYGNUM_NET_SNTP_UNICAST_MAXDHCP];
   578	            struct servent *service;
   579	                cyg_uint32 num;
   580	
   581	            /* See how many addresses we got.  The length should always
   582	             * be a multiple of 4, but cut off any extra bytes and
   583	             * use what we got.
   584	             */
   585	            length /= sizeof(struct in_addr);
   586	
   587	            /* Fill out a sockaddr array for the NTP client */
   588	            service = getservbyname("ntp", "udp");
   589	            CYG_CHECK_DATA_PTR(service, "NTP service not found.");
   590	            memset(&ntp_servers[0], 0, sizeof(ntp_servers));
   591	            for (num = 0; num < length; num++)
   592	            {
   593	                                struct sockaddr_in *saddr = (struct sockaddr_in *)&ntp_servers[num];
   594	
   595	                saddr->sin_len = sizeof(*saddr);
   596	                saddr->sin_family = AF_INET;
   597	                saddr->sin_port = service->s_port;  /* Already network-endian */
   598	                saddr->sin_addr = dhcp_addrs[num];  /* Already network-endian */
   599	            }
   600	
   601	            /* Configure the client with the array */
   602	            cyg_sntp_set_servers(&ntp_servers[0], num);
   603	        }
   604	    }
   605	#endif /* CYGNUM_NET_SNTP_UNICAST_MAXDHCP */
   606	 out:
   607	    if (s != -1) 
   608	      close(s);
   609	    return retcode;
   610	}


-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]