void test_netioctl_withbuf_entry(char *pBuf, int iBufLen) { struct rtentry rtitem; int dst, mask, gateway; int i, fd; fd = socket(AF_INET, SOCK_DGRAM, 0, pBuf, iBufLen); if(fd < 0) { test_printf_error("test_netioctl_withbuf_entry"); return; } memset(&rtitem, 0, sizeof(rtitem)); if(inet_aton(TEST_NETIOCTL_WITH_BUF_DST, (struct in_addr*)&dst, pBuf, iBufLen) == 0) { test_printf_error("test_netioctl_withbuf_entry"); netclose(fd, pBuf, iBufLen); return; } if(inet_aton(TEST_NETIOCTL_WITH_BUF_MASK, (struct in_addr*)&mask, pBuf, iBufLen) == 0) { test_printf_error("test_netioctl_withbuf_entry"); netclose(fd, pBuf, iBufLen); return; } if(inet_aton(TEST_NETIOCTL_WITH_BUF_GATEWAY, (struct in_addr*)&gateway, pBuf, iBufLen) == 0) { test_printf_error("test_netioctl_withbuf_entry"); netclose(fd, pBuf, iBufLen); return; } set_sockaddr((struct sockaddr_in *) &rtitem.rt_dst, dst, 0); set_sockaddr((struct sockaddr_in *) &rtitem.rt_genmask, mask, 0); set_sockaddr((struct sockaddr_in *) &rtitem.rt_gateway, gateway, 0); rtitem.rt_flags = RTF_UP | RTF_GATEWAY; rtitem.rt_dev = "eth1"; if(netioctl_withbuf(fd, SIOCDELRT, &rtitem, sizeof(rtitem), pBuf, iBufLen) < 0) { test_printf_error("test_netioctl_withbuf_entry"); netclose(fd, pBuf, iBufLen); return; } /* printf("To check with \"route\" command in 5 seconds"); for(i = 0; i < 10; i++) { printf("."); tt_msleep(1000); } printf("\n"); */ if(netioctl_withbuf(fd, SIOCADDRT, &rtitem,sizeof(rtitem), pBuf, iBufLen) < 0) { test_printf_error("test_netioctl_withbuf_entry"); netclose(fd, pBuf, iBufLen); return; } test_printf_success("test_netioctl_withbuf_entry"); netclose(fd, pBuf, iBufLen); }
int GetDevInterface(void) { int dev_num = 0; struct ifreq ifbuf[MAXINTERFACES/2]={0}; struct ifconf ifc; int i,fd, ifnum=0; int iInterface; unsigned long ulGateway; dev_num = 1; memset(&ipmc, 0, sizeof(ipmc)); memset(&ifc, 0, sizeof(ifc)); fd = socket(AF_INET, SOCK_DGRAM, 0, g_RemoteNet_Buf, RNT_BUFFER_LEN); if (fd < 0) { perror("socket"); return fd; } ifc.ifc_len = sizeof(ifbuf); ifc.ifc_buf = (caddr_t)ifbuf; if(netioctl_withbuf(fd, SIOCGIFCONF, &ifc,sizeof(ifc), g_RemoteNet_Buf, RNT_BUFFER_LEN) < 0) { netclose(fd, g_RemoteNet_Buf, RNT_BUFFER_LEN); return -1; } ifnum = ifc.ifc_len/sizeof(struct ifreq); for(i=0;i<ifnum;i++) diag_printf("interface name are %s\n",ifbuf[i].ifr_name); //strcpy(ifbuf[0].ifr_name,"eth1"); while(ifnum-- > 0) { if( strlen(ifbuf[ifnum].ifr_name) > 4 ||ifbuf[ifnum].ifr_name == NULL|| strcmp(ifbuf[ifnum].ifr_name,"lo")==0|| netioctl(fd, SIOCGIFFLAGS, &ifbuf[ifnum],sizeof(ifbuf[ifnum]), g_RemoteNet_Buf, RNT_BUFFER_LEN) < 0 || !(ifbuf[ifnum].ifr_flags & IFF_UP) || netioctl(fd, SIOCGIFADDR, &ifbuf[ifnum],sizeof(ifbuf[ifnum]), g_RemoteNet_Buf, RNT_BUFFER_LEN) < 0) continue; diag_printf("if name ===%s\n",ifbuf[ifnum].ifr_name); /*Get the MAC Address*/ if (netioctl(fd, SIOCGIFHWADDR, &ifbuf[ifnum],sizeof(ifbuf[ifnum]), g_RemoteNet_Buf, RNT_BUFFER_LEN) >= 0) diag_printf("MAC Address====%d\n",ifbuf[ifnum].ifr_hwaddr.sa_data); else diag_printf("get mac addr error\n"); /*Get the Netmask*/ if (netioctl(fd, SIOCGIFNETMASK, &ifbuf[ifnum],sizeof(ifbuf[ifnum]), g_RemoteNet_Buf, RNT_BUFFER_LEN) >= 0) diag_printf("Netmask====%s\n",inet_ntoa( (((struct sockaddr_in *)&ifbuf[ifnum].ifr_netmask)->sin_addr), g_RemoteNet_Buf, RNT_BUFFER_LEN)); else diag_printf("get netmask error\n"); /*Get the IP Address*/ if (netioctl(fd, SIOCGIFADDR, &ifbuf[dev_num], sizeof(ifbuf[dev_num]), g_RemoteNet_Buf, RNT_BUFFER_LEN) >= 0) diag_printf("ipaddr Address====%s\n",inet_ntoa((((struct sockaddr_in *)&ifbuf[ifnum].ifr_addr)->sin_addr), g_RemoteNet_Buf, RNT_BUFFER_LEN)); else diag_printf("get if addr error\n"); /*Get the Gateway*/ ulGateway = wb740getgateway(ifbuf[ifnum].ifr_name, g_RemoteNet_Buf, RNT_BUFFER_LEN); diag_printf("Gateway====%s\n",inet_ntoa(*(struct in_addr*)&ulGateway, g_RemoteNet_Buf, RNT_BUFFER_LEN)); dev_num++; } netclose(fd, g_RemoteNet_Buf, RNT_BUFFER_LEN); return dev_num; }
int simple_ioctl_withbuf(void) { struct ifreq ifbuf[4]={0}; struct ifconf ifc; int fd, ifnum=0; memset(&ifc, 0, sizeof(ifc)); fd = socket(AF_INET, SOCK_DGRAM, 0, g_RemoteNet_Buf, RNT_BUFFER_LEN); ifc.ifc_len = sizeof(ifbuf); ifc.ifc_buf = (caddr_t)ifbuf; if(netioctl_withbuf(fd, SIOCGIFCONF, &ifc,sizeof(ifc), g_RemoteNet_Buf, RNT_BUFFER_LEN) < 0) { printf("simple_ioctl_withbuf(): SIOCGIFCONF error\n"); return false; } for(ifnum = 0; ifnum < 4; ifnum++) { if(strlen(ifbuf[ifnum].ifr_name) != 0) printf("simple_ioctl_withbuf(): SIOCGIFCONF's %d interface is %s\n", ifnum, ifbuf[ifnum].ifr_name); } { struct rtentry rtitem; int dst, mask, gateway; memset(&rtitem, 0, sizeof(rtitem)); dst = inet_addr("0.0.0.0", g_RemoteNet_Buf, RNT_BUFFER_LEN); mask = inet_addr("0.0.0.0", g_RemoteNet_Buf, RNT_BUFFER_LEN); gateway = inet_addr("10.132.1.254", g_RemoteNet_Buf, RNT_BUFFER_LEN); set_sockaddr((struct sockaddr_in *) &rtitem.rt_dst, 0, 0); set_sockaddr((struct sockaddr_in *) &rtitem.rt_genmask, 0, 0); set_sockaddr((struct sockaddr_in *) &rtitem.rt_gateway, gateway, 0); rtitem.rt_flags = RTF_UP | RTF_GATEWAY; rtitem.rt_dev = "eth1"; printf("dst=%s ", inet_ntoa(((struct sockaddr_in*)&(rtitem.rt_dst))->sin_addr, g_RemoteNet_Buf, RNT_BUFFER_LEN)); printf("mask=%s ", inet_ntoa(((struct sockaddr_in*)&(rtitem.rt_genmask))->sin_addr, g_RemoteNet_Buf, RNT_BUFFER_LEN)); printf("gateway=%s ", inet_ntoa(((struct sockaddr_in*)&(rtitem.rt_gateway))->sin_addr, g_RemoteNet_Buf, RNT_BUFFER_LEN)); printf("if=%s\n", rtitem.rt_dev); if(netioctl_withbuf(fd, SIOCDELRT, &rtitem,sizeof(rtitem), g_RemoteNet_Buf, RNT_BUFFER_LEN) < 0) { printf("simple_ioctl_withbuf(): SIOCDELRT error\n"); return false; } printf("simple_ioctl_withbuf(): SIOCDELRT success...\n"); cyg_thread_delay(500); if(netioctl_withbuf(fd, SIOCADDRT, &rtitem,sizeof(rtitem), g_RemoteNet_Buf, RNT_BUFFER_LEN) < 0) { printf("simple_ioctl_withbuf(): SIOCADDRT error\n"); return false; } printf("simple_ioctl_withbuf(): SIOCADDRT success...\n"); } netclose(fd, g_RemoteNet_Buf, RNT_BUFFER_LEN); return true; }
BOOL SetGateway(const char *pcInterface, unsigned long ulIP) { #ifndef WLAN struct rtentry rItem; #else struct ecos_rtentry rItem; #endif int fd; unsigned ulOldGateway; int rt; #ifndef WLAN if ((fd = socket(AF_INET,SOCK_DGRAM,0, g_StreamServer_Buf, System_BUFFER_LEN)) < 0) return FALSE; #else if ((fd = socket(AF_INET,SOCK_DGRAM,0)) < 0) return FALSE; #endif memset(&rItem, 0, sizeof(rItem)); #ifndef WLAN set_sockaddr((struct sockaddr_in *) &rItem.rt_dst, 0, 0); set_sockaddr((struct sockaddr_in *) &rItem.rt_genmask, 0, 0); rItem.rt_flags = RTF_UP | RTF_GATEWAY; #else set_sockaddr((struct sockaddr_in *) &rItem.rt_dst, 0, 0); set_sockaddr((struct sockaddr_in *) &rItem.rt_genmask, 0, 0); rItem.rt_flags = RTF_UP| RTF_GATEWAY; #endif rItem.rt_dev = (char *)pcInterface; ulOldGateway = GetGateway(pcInterface); #ifndef WLAN if (ulOldGateway != 0L) { set_sockaddr((struct sockaddr_in *)&rItem.rt_gateway, ulOldGateway, 0); if ((netioctl_withbuf(fd, SIOCDELRT, &rItem , sizeof(rItem), g_StreamServer_Buf, System_BUFFER_LEN)) < 0) fprintf(stderr, "Cannot del default route (%d).\n", errno); } set_sockaddr((struct sockaddr_in *) &rItem.rt_gateway, ulIP, 0); if ((rt = netioctl_withbuf(fd,SIOCADDRT, &rItem, sizeof(rItem),g_StreamServer_Buf,System_BUFFER_LEN)) < 0) { fprintf(stderr, "Cannot add default route (%d).\n", errno); } netclose(fd, g_StreamServer_Buf, System_BUFFER_LEN); #else set_sockaddr((struct sockaddr_in *) &rItem.rt_gateway, ulIP, 0); if ((rt = ioctl(fd,SIOCDELRT, &rItem)) < 0 && (errno != ESRCH)) { fprintf(stderr, "Cannot delete default route (%d).\n", errno); } memset(&rItem, 0, sizeof(rItem)); set_sockaddr((struct sockaddr_in *) &rItem.rt_dst, 0, 0); set_sockaddr((struct sockaddr_in *) &rItem.rt_genmask, 0, 0); rItem.rt_flags = RTF_UP | RTF_GATEWAY; rItem.rt_dev = (char *)pcInterface; set_sockaddr((struct sockaddr_in *) &rItem.rt_gateway, ulIP, 0); if ((rt = ioctl(fd,SIOCADDRT, &rItem)) < 0) { fprintf(stderr, "Cannot add default route (%d).\n", errno); } close(fd); #endif return (rt < 0 ? FALSE : TRUE); }