int nettest_main(int argc, char *argv[]) #endif { int mode = 0; nettest_proto_e proto = NT_NONE; int num_packets_to_process = 0; uint32_t interval = 0; /* pps - packet per second, default value 1 */ uint32_t pps = 1; if (argc < 6) { goto err_with_input; } mode = atoi(argv[1]); if (mode != NETTEST_SERVER_MODE && mode != NETTEST_CLIENT_MODE) { goto err_with_input; } if (strlen(argv[2]) != strlen(NETTEST_PROTO_TCP)) { goto err_with_input; } if (!strncmp(argv[2], NETTEST_PROTO_TCP, strlen(NETTEST_PROTO_TCP) + 1)) { proto = NT_TCP; } else if (!strncmp(argv[2], NETTEST_PROTO_UDP, strlen(NETTEST_PROTO_UDP) + 1)) { proto = NT_UDP; } else if (!strncmp(argv[2], NETTEST_PROTO_BROADCAST, strlen(NETTEST_PROTO_BROADCAST) + 1)) { proto = NT_BROADCAST; } else if (!strncmp(argv[2], NETTEST_PROTO_MULTICAST, strlen(NETTEST_PROTO_MULTICAST) + 1)) { proto = NT_MULTICAST; } else { goto err_with_input; } g_app_target_addr = argv[3]; g_app_target_port = atoi(argv[4]); num_packets_to_process = atoi(argv[5]); if (num_packets_to_process < 0 || num_packets_to_process > NETTEST_MAX_PACKETS) { goto err_with_input; } if (mode == NETTEST_SERVER_MODE) { if (proto == NT_TCP) { tcp_server_thread(num_packets_to_process); } else if (proto == NT_UDP) { udp_server_thread(num_packets_to_process); } else if (proto == NT_BROADCAST) { broadcast_receive(num_packets_to_process); } else if (proto == NT_MULTICAST) { if (argc != 7) { goto err_with_input; } ipmcast_receiver_thread(num_packets_to_process, argv[6]); } } else if (mode == NETTEST_CLIENT_MODE) { if (argc < 7) { goto err_with_input; } /* get interval */ pps = atoi(argv[6]); if (pps <= 0) { goto err_with_input; } interval = 1000000ul / pps; /* sleep interval */ if (proto == NT_TCP) { tcp_client_thread(num_packets_to_process, interval); } else if (proto == NT_UDP) { udp_client_thread(num_packets_to_process, interval); } else if (proto == NT_BROADCAST) { broadcast_send(num_packets_to_process, interval); } else if (proto == NT_MULTICAST) { if (argc != 8) { goto err_with_input; } ipmcast_sender_thread(num_packets_to_process, interval, argv[7]); } } printf("Exiting nettest_main thread, job finished\n"); return 0; err_with_input: show_usage(); return -1; }
/*---------------------------------------------------------------------------*/ int main(void) { uint16_t rval; /* init hardware layer */ init_hci(); timer1_init(); init_serial(); sei(); led1_high(); led2_high(); /* init protothreads */ PT_INIT(&blink_pt); PT_INIT(&nrf24_pt); PT_INIT(&www_client_pt); PT_INIT(&www_server_pt); PT_INIT(&udp_server_pt); PT_INIT(&coap_server_pt); PT_INIT(&temperature_pt); PT_INIT(&udp_broadcast_pt); /* greeting message */ dbg(PSTR("> Hello World!\r\n")); /* init the ethernet chip */ enc28j60Init(mymac); enc28j60PhyWrite(PHLCON,0x476); /* get automatic IP */ rval=0; init_mac(mymac); while(rval==0) { plen=enc28j60PacketReceive(BUFFER_SIZE, buf); rval=packetloop_dhcp_initial_ip_assignment(buf,plen,mymac[5]); } dhcp_get_my_ip(myip,netmask,gwip); client_ifconfig(myip,netmask); /* learn the MAC address of the gateway */ get_mac_with_arp(gwip,0,&arpresolver_result_callback); while(get_mac_with_arp_wait()) { plen=enc28j60PacketReceive(BUFFER_SIZE, buf); packetloop_arp_icmp_tcp(buf,plen); } /* set WWW server port */ www_server_port(MYWWWPORT); dbg(PSTR("> System is ready.\r\n")); led1_low(); led2_low(); /* main loop */ while(1) { if(enc28j60linkup()) { /* poll hardware ethernet buffer */ plen = enc28j60PacketReceive(BUFFER_SIZE,buf); /* terminate the buffer */ buf[BUFFER_SIZE]='\0'; /* handle DHCP messages if neccessary */ plen = packetloop_dhcp_renewhandler(buf,plen); /* handle and analyse the packet slightly */ dat_p = packetloop_arp_icmp_tcp(buf,plen); if( dat_p == 0) { udp_client_check_for_dns_answer(buf,plen); } new_packet = 0xFF; PT_SCHEDULE(blink_thread(&blink_pt)); PT_SCHEDULE(nrf24_thread(&nrf24_pt)); PT_SCHEDULE(www_server_thread(&www_server_pt)); PT_SCHEDULE(udp_server_thread(&udp_server_pt)); PT_SCHEDULE(www_client_thread(&www_client_pt)); PT_SCHEDULE(coap_server_thread(&coap_server_pt)); PT_SCHEDULE(temperature_thread(&temperature_pt)); PT_SCHEDULE(udp_broadcast_thread(&udp_broadcast_pt)); } } return 0; }