static void fnet_arp_trace(char *str, fnet_arp_header_t *arp_hdr) { char mac_str[FNET_MAC_ADDR_STR_SIZE]; char ip_str[FNET_IP4_ADDR_STR_SIZE]; fnet_printf(FNET_SERIAL_ESC_FG_GREEN"%s", str); /* Print app-specific header.*/ fnet_println("[ARP header]"FNET_SERIAL_ESC_FG_BLACK); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); fnet_println("|(HWType) 0x%04x |(PrType) 0x%04x |", fnet_ntohs(arp_hdr->hard_type), fnet_ntohs(arp_hdr->prot_type)); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); fnet_println("|(HWSize) 0x%02x |(PrSize) 0x%02x |(Opcode) %5u |", arp_hdr->hard_size, arp_hdr->prot_size, fnet_ntohs(arp_hdr->op)); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/\\/\\/\\/-+"); fnet_mac_to_str(arp_hdr->sender_hard_addr, mac_str); fnet_println("|(SenderHWAddr) "FNET_SERIAL_ESC_FG_BLUE"%17s"FNET_SERIAL_ESC_FG_BLACK" |", mac_str); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/\\/\\/\\/-+"); fnet_println("|(SenderPrAddr) "FNET_SERIAL_ESC_FG_BLUE"%15s"FNET_SERIAL_ESC_FG_BLACK" |", fnet_inet_ntoa(*(struct in_addr *)(&arp_hdr->sender_prot_addr), ip_str)); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/\\/\\/\\/-+"); fnet_mac_to_str(arp_hdr->target_hard_addr, mac_str); fnet_println("|(TargetHWAddr) "FNET_SERIAL_ESC_FG_BLUE"%17s"FNET_SERIAL_ESC_FG_BLACK" |", mac_str); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/\\/\\/\\/-+"); fnet_println("|(TargetPrAddr) "FNET_SERIAL_ESC_FG_BLUE"%15s"FNET_SERIAL_ESC_FG_BLACK" |", fnet_inet_ntoa(*(struct in_addr *)(&arp_hdr->targer_prot_addr), ip_str)); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); }
/************************************************************************ * NAME: fapp_netif_info_print * * DESCRIPTION: Print detailed address information about default * network interface. ************************************************************************/ void fapp_netif_info_print( fnet_shell_desc_t desc, fnet_netif_desc_t netif) { fnet_char_t name[FNET_NETIF_NAMELEN]; fnet_netif_get_name(netif, name, sizeof(name)); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "Interface", name); fapp_netif_addr_print(desc, AF_SUPPORTED, netif, FNET_TRUE); #if FNET_CFG_IP4 { fnet_ip4_addr_t ip_addr; fnet_char_t ip_str[FNET_IP4_ADDR_STR_SIZE]; ip_addr = fnet_netif_get_ip4_subnet_mask(netif); fnet_inet_ntoa(*(struct in_addr *)( &ip_addr), ip_str); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "IPv4 Subnet mask", ip_str); ip_addr = fnet_netif_get_ip4_gateway(netif); fnet_inet_ntoa(*(struct in_addr *)( &ip_addr), ip_str); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "IPv4 Gateway", ip_str); #if FNET_CFG_DNS ip_addr = fnet_netif_get_ip4_dns(netif); fnet_inet_ntoa(*(struct in_addr *)( &ip_addr), ip_str); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "IPv4 DNS", ip_str); #endif } #endif /* FNET_CFG_IP4 */ }
static void fapp_get_ip(fnet_shell_desc_t desc, fnet_ip4_addr_t (*get_address)( fnet_netif_desc_t netif_desc )) { char ip_str[FNET_IP4_ADDR_STR_SIZE]; struct in_addr addr; addr.s_addr = get_address(fapp_default_netif); fnet_inet_ntoa(addr, ip_str); fnet_shell_println(desc, FAPP_GET_SOPT_FORMAT, ip_str); }
/************************************************************************ * NAME: fapp_netif_addr_print * * DESCRIPTION: Print Interface IP addresses. ************************************************************************/ void fapp_netif_addr_print(fnet_shell_desc_t desc, fnet_address_family_t family, fnet_netif_desc_t netif, fnet_bool_t print_type) { fnet_char_t ip_str[FNET_IP_ADDR_STR_SIZE]={0}; #if FNET_CFG_IP4 if((family & AF_INET)==AF_INET) { fnet_ip4_addr_t local_ip; local_ip = fnet_netif_get_ip4_addr(netif); fnet_shell_printf(desc, FAPP_SHELL_INFO_FORMAT_S, "IPv4 Address", fnet_inet_ntoa(*(struct in_addr *)(&local_ip), ip_str) ); if(print_type) { fnet_shell_println(desc," <%s>", fnet_netif_get_ip4_addr_automatic(netif) ? "automatic" : "manual"); } else { fnet_shell_println(desc, ""); } } #endif /* FNET_CFG_IP4 */ #if FNET_CFG_IP6 if((family & AF_INET6)==AF_INET6) { fnet_bool_t result; fnet_index_t n; fnet_netif_ip6_addr_info_t addr_info; /* Print all assigned IPv6 addreses.*/ n=0u; for(;;) { result = fnet_netif_get_ip6_addr (netif, n, &addr_info); if(result == FNET_TRUE) { fnet_inet_ntop(AF_INET6, (fnet_uint8_t*)(&addr_info.address), ip_str, sizeof(ip_str)); fnet_shell_printf(desc, FAPP_SHELL_INFO_FORMAT_S, "IPv6 Address", ip_str); if(print_type) { fnet_shell_println(desc," <%s> ScopeID:%d", (addr_info.type == FNET_NETIF_IP6_ADDR_TYPE_AUTOCONFIGURABLE) ? "autoconfigurable" : "manual", fnet_netif_get_scope_id(netif)); } else { fnet_shell_println(desc,""); } } else { break; } n++; } } #endif /* FNET_CFG_IP6 */ }
static void fapp_dup_ip_handler( fnet_netif_desc_t netif ) { fnet_char_t name[FNET_NETIF_NAMELEN]; fnet_char_t ip_str[FNET_IP4_ADDR_STR_SIZE]; fnet_ip4_addr_t addr; fnet_netif_get_name( netif, name, sizeof(name) ); addr = fnet_netif_get_ip4_addr( netif ); fnet_inet_ntoa(*(struct in_addr *)( &addr), ip_str); fnet_printf(FAPP_DUP_IP_WARN, name, ip_str); }
static void fnet_igmp_trace(char *str, fnet_igmp_header_t *igmp_hdr) { char ip_str[FNET_IP4_ADDR_STR_SIZE]; fnet_printf(FNET_SERIAL_ESC_FG_GREEN"%s", str); /* Print app-specific header.*/ fnet_println("[IGMP header]"FNET_SERIAL_ESC_FG_BLACK); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); fnet_println("|(Type) "FNET_SERIAL_ESC_FG_BLUE"0x%2x"FNET_SERIAL_ESC_FG_BLACK" |(Res Time) %3u |(Cheksum) 0x%04x |", igmp_hdr->type, igmp_hdr->max_resp_time, fnet_ntohs(igmp_hdr->checksum)); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); fnet_println("|(Group Addr) "FNET_SERIAL_ESC_FG_BLUE"%15s"FNET_SERIAL_ESC_FG_BLACK" |", fnet_inet_ntoa(*(struct in_addr *)(&igmp_hdr->group_addr), ip_str)); fnet_println("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); }
/************************************************************************ * NAME: fapp_dhcp_info * * DESCRIPTION: *************************************************************************/ void fapp_dhcp_info(fnet_shell_desc_t desc) { fnet_char_t ip_str[FNET_IP4_ADDR_STR_SIZE]; fnet_bool_t dhcp_is_enabled = fnet_dhcp_is_enabled(fapp_dhcp_desc); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "DHCP Client", fapp_enabled_str[dhcp_is_enabled]); if(dhcp_is_enabled && (fnet_netif_get_ip4_addr_type(fnet_netif_get_default()) == FNET_NETIF_IP_ADDR_TYPE_DHCP)) { struct fnet_dhcp_options options; fnet_dhcp_get_options(fapp_dhcp_desc, &options); fnet_inet_ntoa(*(struct in_addr *)( &options.dhcp_server), ip_str); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "DHCP Server", ip_str); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_D, "Lease Time", fnet_ntohl(options.lease_time)); } }
/************************************************************************ * NAME: fapp_dhcp_info * * DESCRIPTION: *************************************************************************/ void fapp_dhcp_info(fnet_shell_desc_t desc) { fnet_char_t ip_str[FNET_IP4_ADDR_STR_SIZE]; fnet_bool_t dhcp_enabled = fnet_dhcp_enabled(fapp_dhcp_desc); fnet_bool_t address_automatic = fnet_netif_get_ip4_addr_automatic(fnet_netif_get_default()); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "DHCP Client", dhcp_enabled ? FAPP_SHELL_INFO_ENABLED : FAPP_SHELL_INFO_DISABLED); if(dhcp_enabled && address_automatic) { struct fnet_dhcp_options options; fnet_dhcp_get_options(fapp_dhcp_desc, &options); fnet_inet_ntoa(*(struct in_addr *)( &options.dhcp_server), ip_str); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "DHCP Server", ip_str); fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_D, "Lease Time", fnet_ntohl(options.lease_time)); } }
/************************************************************************ * NAME: fapp_bench_udp_rx * * DESCRIPTION: Start Benchmark UDP server. ************************************************************************/ static void fapp_bench_udp_rx (fnet_shell_desc_t desc, fnet_address_family_t family, fnet_ip4_addr_t multicast_address /* optional, set to 0*/) { struct sockaddr local_addr; const unsigned long bufsize_option = FAPP_BENCH_SOCKET_BUF_SIZE; int received; char ip_str[FNET_IP_ADDR_STR_SIZE]; struct sockaddr addr; int addr_len; int is_first = 1; int exit_flag = 0; /* Create listen socket */ if((fapp_bench.socket_listen = socket(family, SOCK_DGRAM, 0)) == SOCKET_INVALID) { FNET_DEBUG("BENCH: Socket creation error.\n"); goto ERROR_1; } /*Bind.*/ fnet_memset_zero(&local_addr, sizeof(local_addr)); local_addr.sa_port = FAPP_BENCH_PORT; local_addr.sa_family = family; if(bind(fapp_bench.socket_listen, &local_addr, sizeof(local_addr)) == SOCKET_ERROR) { FNET_DEBUG("BENCH: Socket bind error.\n"); goto ERROR_2; } /* Set socket options. */ if( /* Set socket buffer size. */ (setsockopt(fapp_bench.socket_listen, SOL_SOCKET, SO_RCVBUF, (char *) &bufsize_option, sizeof(bufsize_option))== SOCKET_ERROR) || (setsockopt(fapp_bench.socket_listen, SOL_SOCKET, SO_SNDBUF, (char *) &bufsize_option, sizeof(bufsize_option))== SOCKET_ERROR) ) { FNET_DEBUG("BENCH: Socket setsockopt error.\n"); goto ERROR_2; } /* Join multicast group, if set. */ if(multicast_address) { struct ip_mreq mreq; /* Multicast group information.*/ mreq.imr_multiaddr.s_addr = multicast_address; mreq.imr_interface.s_addr = FNET_HTONL(INADDR_ANY); /* Default Interface.*/ /* Join multicast group. */ if(setsockopt(fapp_bench.socket_listen, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) == SOCKET_ERROR) { FNET_DEBUG("BENCH: Joining to multicast group is failed.\n"); goto ERROR_2; } } /* ------ Start test.----------- */ fnet_shell_println(desc, FAPP_DELIMITER_STR); fnet_shell_println(desc, " UDP RX Test" ); fnet_shell_println(desc, FAPP_DELIMITER_STR); fapp_netif_addr_print(desc, family, fapp_default_netif, FNET_FALSE); if(multicast_address) { fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "Multicast Group", fnet_inet_ntoa(*(struct in_addr *)(&multicast_address), ip_str) ); } fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_D, "Local Port", FNET_NTOHS(FAPP_BENCH_PORT)); fnet_shell_println(desc, FAPP_TOCANCEL_STR); fnet_shell_println(desc, FAPP_DELIMITER_STR); while(exit_flag == 0) /* Main loop */ { fnet_shell_println(desc, "Waiting."); fapp_bench.bytes = 0; fapp_bench.remote_bytes = 0; addr_len = sizeof(addr); is_first = 1; while(exit_flag == 0) /* Test loop. */ { /* Receive data */ received = recvfrom (fapp_bench.socket_listen, (char*)(&fapp_bench.buffer[0]), FAPP_BENCH_BUFFER_SIZE, 0, &addr, &addr_len ); if(received >= FAPP_BENCH_UDP_END_BUFFER_LENGTH) { /* Reset timeout. */ fapp_bench.last_time = fnet_timer_ticks(); if(is_first) { if( received > FAPP_BENCH_UDP_END_BUFFER_LENGTH ) { fnet_shell_println(desc,"Receiving from %s:%d", fnet_inet_ntop(addr.sa_family, (char*)(addr.sa_data), ip_str, sizeof(ip_str)), fnet_ntohs(addr.sa_port)); fapp_bench.first_time = fnet_timer_ticks(); is_first = 0; } } else { if(received == FAPP_BENCH_UDP_END_BUFFER_LENGTH ) /* End of transfer. */ { /* Send ACK containing amount of received data.*/ unsigned long ack_bytes = fnet_htonl(fapp_bench.bytes); /* Send several times, just to be sure that it is received/not lost.*/ sendto(fapp_bench.socket_listen, (char*)(&ack_bytes), sizeof(ack_bytes), 0, (struct sockaddr*)&addr, sizeof(addr)); sendto(fapp_bench.socket_listen, (char*)(&ack_bytes), sizeof(ack_bytes), 0, (struct sockaddr*)&addr, sizeof(addr)); sendto(fapp_bench.socket_listen, (char*)(&ack_bytes), sizeof(ack_bytes), 0, (struct sockaddr*)&addr, sizeof(addr)); /* Print benchmark results.*/ fapp_bench_print_results (desc); break; } else fapp_bench.bytes += received; } } else { /* Check error. Check timeout */ if(received == SOCKET_ERROR) { fnet_shell_println(desc, "BENCH: Error (%d).", fnet_error_get()); break; } /* Check timeout. */ if((is_first == 0) && (fnet_timer_get_interval(fapp_bench.last_time, fnet_timer_ticks()) > (FAPP_UDP_TIMEOUT_MS/FNET_TIMER_PERIOD_MS))) { fnet_shell_println(desc, "BENCH: Exit on timeout."); fapp_bench_print_results (desc); break; } } exit_flag = fnet_shell_ctrlc (desc); } } ERROR_2: closesocket(fapp_bench.socket_listen); ERROR_1: fnet_shell_println(desc, FAPP_BENCH_COMPLETED_STR); }
static int fapp_http_ssi_echo_handle(char * query, long *cookie) { int result = FNET_OK; const struct fapp_http_echo_variable * echo_var_ptr; fnet_netif_desc_t netif = fapp_default_netif; const char *ssi_buffer_ptr = 0; /* Find static echo value. */ for(echo_var_ptr = fapp_http_echo_variables; echo_var_ptr->variable && echo_var_ptr->value; echo_var_ptr++) { if (!fnet_strcmp( query, echo_var_ptr->variable)) { ssi_buffer_ptr = echo_var_ptr->value; break; } } /* Find run-time echo values. */ if(ssi_buffer_ptr == 0) { #if FNET_CFG_IP4 char ip_str[FNET_IP4_ADDR_STR_SIZE]; #endif ssi_buffer_ptr = fapp_http_ssi_buffer; if (!fnet_strcmp( query, "IP_ADDRESS")) { #if FNET_CFG_IP4 fnet_ip4_addr_t ip_adr = fnet_netif_get_ip4_addr(netif); fnet_inet_ntoa(*(struct in_addr *)( &ip_adr), ip_str); fnet_snprintf(fapp_http_ssi_buffer, sizeof(fapp_http_ssi_buffer), "%s", ip_str); #else fnet_snprintf(fapp_http_ssi_buffer, sizeof(fapp_http_ssi_buffer), "..."); #endif /* FNET_CFG_IP4 */ } else if (!fnet_strcmp( query, "SUBNET_MASK")) { #if FNET_CFG_IP4 fnet_ip4_addr_t ip_adr = fnet_netif_get_ip4_subnet_mask(netif); fnet_inet_ntoa(*(struct in_addr *)( &ip_adr), ip_str); fnet_snprintf(fapp_http_ssi_buffer, sizeof(fapp_http_ssi_buffer), "%s", ip_str); #else fnet_snprintf(fapp_http_ssi_buffer, sizeof(fapp_http_ssi_buffer), "..."); #endif /* FNET_CFG_IP4 */ } else if (!fnet_strcmp( query, "GATEWAY")) { #if FNET_CFG_IP4 fnet_ip4_addr_t ip_adr = fnet_netif_get_ip4_gateway(netif); fnet_inet_ntoa(*(struct in_addr *)( &ip_adr), ip_str); fnet_snprintf(fapp_http_ssi_buffer, sizeof(fapp_http_ssi_buffer), "%s", ip_str); #else fnet_snprintf(fapp_http_ssi_buffer, sizeof(fapp_http_ssi_buffer), "..."); #endif /* FNET_CFG_IP4 */ } else if (!fnet_strcmp( query, "MAC")) { fnet_mac_addr_t macaddr; char mac_str[FNET_MAC_ADDR_STR_SIZE]; fnet_netif_get_hw_addr(netif, macaddr, sizeof(fnet_mac_addr_t)); fnet_mac_to_str(macaddr, mac_str); fnet_snprintf(fapp_http_ssi_buffer, sizeof(fapp_http_ssi_buffer), "%s", mac_str); } else { result = FNET_ERR; } } *cookie = (long)ssi_buffer_ptr; /* Save ssi_buffer_ptr as cookie.*/ return result; }