snmpping.c
来自「eCos操作系统源码」· C语言 代码 · 共 669 行 · 第 1/2 页
C
669 行
dp = (long *)tp; for (i = sizeof(*tp); i < icmp_len; i += sizeof(*dp)) { *dp++ = i; } // Add checksum icmp->icmp_cksum = inet_cksum( (u_short *)icmp, icmp_len+8); // Send it off if (sendto(s, icmp, icmp_len+8, 0, (struct sockaddr *)host, sizeof(*host)) < 0) { TNR_OFF(); perror("sendto"); continue; } // Wait for a response fromlen = sizeof(from); len = recvfrom(s, pkt2, sizeof(pkt2), 0, (struct sockaddr *)&from, &fromlen); TNR_OFF(); if (len < 0) { perror("recvfrom"); icmp_len = MIN_PACKET - PACKET_ADD; // just in case - long routes } else { if (show_icmp(pkt2, len, &from, host)) { ok_recv++; } else { bogus_recv++; } } } TNR_OFF(); diag_printf("Sent %d packets, received %d OK, %d bad\n", NUM_PINGS, ok_recv, bogus_recv);}static voidping_test(struct bootp *bp){ struct protoent *p; struct timeval tv; struct sockaddr_in host; int s; if ((p = getprotobyname("icmp")) == (struct protoent *)0) { perror("getprotobyname"); return; } s = socket(AF_INET, SOCK_RAW, p->p_proto); if (s < 0) { perror("socket"); return; } tv.tv_sec = 1; tv.tv_usec = 0; setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); // Set up host address host.sin_family = AF_INET; host.sin_len = sizeof(host); host.sin_addr = bp->bp_siaddr; host.sin_port = 0; ping_host(s, &host); // Now try a bogus host // (also, map 76 <-> 191 so that if a pair runs they ping each other) host.sin_addr = bp->bp_yiaddr; // *my* address.// host.sin_addr.s_addr = htonl(ntohl(host.sin_addr.s_addr) ^ 0xf3); host.sin_addr.s_addr = htonl(ntohl(host.sin_addr.s_addr) ^ 2); ping_host(s, &host); close(s);}static voidping_test_loopback( int lo ){ struct protoent *p; struct timeval tv; struct sockaddr_in host; int s; if ((p = getprotobyname("icmp")) == (struct protoent *)0) { perror("getprotobyname"); return; } s = socket(AF_INET, SOCK_RAW, p->p_proto); if (s < 0) { perror("socket"); return; } tv.tv_sec = 1; tv.tv_usec = 0; setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); // Set up host address host.sin_family = AF_INET; host.sin_len = sizeof(host); host.sin_addr.s_addr = htonl(INADDR_LOOPBACK + (0x100 * lo)); host.sin_port = 0; ping_host(s, &host); // Now try a bogus host host.sin_addr.s_addr = htonl(ntohl(host.sin_addr.s_addr) + 32); ping_host(s, &host); close(s);}#ifdef CYGSEM_SNMPAGENT_TESTS_PROMISCUOUSstatic void interface_promisc(const char *intf){ struct ifreq ifr; int s; s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { perror("socket"); return; } strcpy(ifr.ifr_name, intf); ifr.ifr_flags = IFF_UP | IFF_BROADCAST | IFF_RUNNING | IFF_PROMISC; if (ioctl(s, SIOCSIFFLAGS, &ifr)) { perror("SIOCSIFFLAGS"); } close(s);}#endif // CYGSEM_SNMPAGENT_TESTS_PROMISCUOUSvoid snmp_do_reinit( void ){ diag_printf( "SNMP re-init function\n" );#ifdef CYGSEM_SNMPAGENT_TESTS_SNMPv3 // Initialisation for USM is now invoked from mib_module_inits.h //init_usmUser(); /* MIBs to support SNMPv3 */ //init_usmStats(); //init_snmpEngine(); usm_parse_create_usmUser(NULL, "root MD5 md5passwd DES DESpasswd");#endif // CYGSEM_SNMPAGENT_TESTS_SNMPv3}int create_snmpd_conf (void) {#ifdef CYGSEM_SNMPAGENT_TESTS_SNMPv3#ifdef CYGPKG_SNMPLIB_FILESYSTEM_SUPPORT #ifdef CYGPKG_FS_RAM int c; FILE *fd; diag_printf ("\nStarting creation of snmpd.conf\n"); /* Mount RAM-FS */ if (mount ("", "/", "ramfs") != 0) { diag_printf ("File system mount failed; errno=%d \n", errno); return -1; } if (mkdir ("/etc", 0) != 0) { diag_printf ("mkdir (etc) failed; errno=%d\n", errno); return -1; } if (chdir ("/etc") != 0) { diag_printf ("... Change-dir (etc) failed; errno=%d\n", errno); return -1; } else { diag_printf ("chdir-etc done\n"); } if (mkdir ("snmp", 0) != 0) { diag_printf ("mkdir failed (snmp); errno=%d\n", errno); return -1; } else { diag_printf ("mkdir-snmp done\n"); } if (chdir ("snmp") != 0) { diag_printf ("... Change-dir (snmp) failed; errno=%d\n", errno); return -1; } else { diag_printf ("... Change-dir (snmp) done \n"); } /* Open File & Write to it */ if ((fd = fopen( "snmpd.conf", "w" )) == NULL) { diag_printf ("fopen failed\n"); return -1; } fprintf (fd, "# sec.name source community\n"); fprintf (fd, "com2sec public default crux\n"); fprintf (fd, "com2sec root default crux\n"); fprintf (fd, "# sec.model sec.name\n"); fprintf (fd, "group public v1 public\n"); fprintf (fd, "group public v2c public\n"); fprintf (fd, "group public usm root\n"); fprintf (fd, "view all included .1\n"); fprintf (fd, "access public \"\" any noauth exact all none none\n"); fprintf (fd, "\n\n"); if (fclose (fd)) { diag_printf ("fclose failed\n"); return -1; } /* Read Back */ fd = fopen( "/etc/snmp/snmpd.conf", "r" ); if (fd == NULL) { diag_printf ("fopen failed\n"); return -1; } while ((c=fgetc (fd)) != EOF) { diag_printf ("%c", c); } if (fclose (fd)) { diag_printf ("fclose failed\n"); return -1; }#endif#endif#endif return 0;}voidnet_test(cyg_addrword_t p){ int i = CYGNUM_SNMPAGENT_TESTS_ITERATIONS; int ieth0_up = 0, ieth1_up = 0; int j; diag_printf("Start PING test\n"); TNR_INIT(); init_all_network_interfaces();#ifdef CYGHWR_NET_DRIVER_ETH0 ieth0_up = eth0_up;#endif#ifdef CYGHWR_NET_DRIVER_ETH1 ieth1_up = eth1_up;#endif#ifdef CYGSEM_SNMPAGENT_TESTS_PROMISCUOUS#ifdef CYGHWR_NET_DRIVER_ETH0 if (eth0_up) interface_promisc("eth0");#endif#ifdef CYGHWR_NET_DRIVER_ETH1 if (eth1_up) interface_promisc("eth1");#endif#endif // CYGSEM_SNMPAGENT_TESTS_PROMISCUOUS { extern void cyg_net_snmp_init(void); extern void (*snmpd_reinit_function)( void ); snmpd_reinit_function = snmp_do_reinit; if (create_snmpd_conf ()) { CYG_TEST_FAIL_EXIT("create_snmpd_conf() error\n"); } cyg_net_snmp_init(); } do { TNR_ON();#ifdef CYGHWR_NET_DRIVER_ETH0 if (eth0_up) { ping_test(ð0_bootp_data); cyg_thread_delay(500); }#endif#if NLOOP > 0 for ( j = 0; j < NLOOP; j++ ) { ping_test_loopback( j ); cyg_thread_delay(500); }#endif#ifdef CYGHWR_NET_DRIVER_ETH1 if (eth1_up) { ping_test(ð1_bootp_data); cyg_thread_delay(500); }#endif TNR_OFF(); TNR_PRINT_ACTIVITY(); // If an interface has gone down eg. due to DHCP timing out, // re-initialize everything: if (0#ifdef CYGHWR_NET_DRIVER_ETH0 || ieth0_up != eth0_up#endif#ifdef CYGHWR_NET_DRIVER_ETH1 || ieth1_up != eth1_up #endif ) { diag_printf( "Re-initializing the world: eth0 %d/%d eth1 %d/%d!\n", ieth0_up, 0#ifdef CYGHWR_NET_DRIVER_ETH0 | eth0_up#endif , ieth1_up, 0#ifdef CYGHWR_NET_DRIVER_ETH1 | eth1_up#endif ); init_all_network_interfaces(); for ( j = 0; j < CYGPKG_NET_NLOOP; j++ ) init_loopback_interface( j ); diag_printf( "Re-initialized the world: eth0 %d/%d eth1 %d/%d!\n", ieth0_up, 0#ifdef CYGHWR_NET_DRIVER_ETH0 | eth0_up#endif , ieth1_up, 0#ifdef CYGHWR_NET_DRIVER_ETH1 | eth1_up#endif ); } } while ( i-- > 0 ); CYG_TEST_PASS_FINISH( "Done pinging while SNMP looks on" );}voidcyg_start(void){ // Create a main thread, so we can run the scheduler and have time 'pass' cyg_thread_create(10, // Priority - just a number net_test, // entry 0, // entry parameter "Network test", // Name &stack[0], // Stack STACK_SIZE, // Size &thread_handle, // Handle &thread_data // Thread data structure ); cyg_thread_resume(thread_handle); // Start it cyg_scheduler_start();}// EOF snmpping.c
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?