www.pudn.com > test11.rar > plugs.h, change:2008-07-31,size:15752b
// | file: plugs.h // | // | Types and routines for the // | the "plugs" embedded tcp/ip stack // | library. // | // | David Van Brink / 2001 / Altera Corporation // | #ifndef _plugs_ #define _plugs_ #include "excalibur.h" // ++==================================== // || // || CONFIGURATION // || The following constants can be // || modified to control the build. // || This can be used to tune footprint. // || Override them in your gcc options, // || or (more dangerously) modify them here. // Include code to allow debug printing? // Set to 0 for "no", and to 2 for "even more printing" #ifndef PLUGS_DEBUG #define PLUGS_DEBUG 1 #endif // Maximum number of plugs (CANNOT be more than 32!) #ifndef PLUGS_PLUG_COUNT #define PLUGS_PLUG_COUNT 10 #endif // Maximum number of adapters #ifndef PLUGS_ADAPTER_COUNT #define PLUGS_ADAPTER_COUNT 2 #endif // DNS access built-in? #ifndef PLUGS_DNS #define PLUGS_DNS 1 #endif // PING responder built-in? #ifndef PLUGS_PING #define PLUGS_PING 1 #endif // TCP support? #ifndef PLUGS_TCP #define PLUGS_TCP 1 #endif // IRQ support? #ifndef PLUGS_IRQ #define PLUGS_IRQ 1 #endif // DHCP support? #ifndef PLUGS_DHCP #define PLUGS_DHCP 1 #endif // +------------------------------------- // | To overlay C structures on raw received // | ethernet packets, we must ensure that // | there's no padding in the struct. // | (Aligning down to halfwords is fine, network // | structures are all 16-bit-word based.) // | For GCC, this is done as follows. #define nm_packed __attribute__ ((packed,aligned(2))) // +------------------------------------- // | Primitive network types // | Defined as structs so you cannot // | accidentally use them as ints // | (except for net_8). typedef unsigned char host_8; // | host 8 typedef unsigned short host_16; // | host 16 typedef unsigned long host_32; // | host 32 typedef unsigned char net_8; // | network 8 typedef unsigned short net_16; // | network 16 typedef unsigned long net_32; // | network 32 typedef struct { net_32 u32; // | upper 32 bits of 48 bit address net_16 l16; // | lower 16 bits of 48 bit address } nm_packed net_48; typedef net_48 host_48; // +------------------------------------- // | Configuration block with various // | network info typedef struct { net_48 ethernet_address; short flags; net_32 ip_address; net_32 nameserver_ip_address; net_32 subnet_mask; net_32 gateway_ip_address; } nm_packed ns_plugs_network_settings; // +------------------------------------- // | Structure and location of flash-based // | network settings in flash... // | If you pass 0 for network settings pointer, // | you get default index of existing settings. // | If you pass -1, -2, &c for // | the network settings pointer, initialize // | to that flash based value. // | typedef struct { int signature; // must be 0x00005afe for network settings ns_plugs_network_settings settings; } ns_plugs_persistent_network_settings; #ifdef nasys_main_flash #if __nios32__ #if nasys_main_flash_size == 0x100000 // apex board 1meg flash #define nasys_plugs_persistent_network_settings \ ((ns_plugs_persistent_network_settings *)(nasys_main_flash + 0x6000)) #else // last 64k of 8meg stratix/cyclone flash... #define nasys_plugs_persistent_network_settings \ ((ns_plugs_persistent_network_settings *)(nasys_main_flash + 0x7f0000)) #endif #else // nios 16, just use beginning of flash memory #define nasys_plugs_persistent_network_settings \ ((ns_plugs_persistent_network_settings *)(nasys_main_flash)) #endif #endif // +------------------------------------- // | Definitions of each supported packet type typedef struct { void *header; int length; } ns_plugs_packet; typedef struct { net_48 destination_address; net_48 source_address; net_16 type; unsigned char payload[0]; // | generic payload } nm_packed ns_plugs_ethernet_packet; typedef struct { net_16 hardware_type; // | 1 = ethernet net_16 protocol_type; net_8 hardware_size; // | 6 for ethernet net_8 protocol_size; // | 4 for IP net_16 op; // | 1: req, 2: rep, 3: rarp req, 4: rarp rep net_48 sender_ethernet_address; net_32 sender_ip_address; net_48 target_ethernet_address; net_32 target_ip_address; } nm_packed ns_plugs_arp_packet; typedef struct { net_8 version_header_length; // | 0x45 for no options net_8 tos; // | zero net_16 length; // | header + payload length net_16 identifier; // | bump for each packet net_16 flags_fragment; // | fragment miscellany net_8 time_to_live; // | send with 128, usually net_8 protocol; // | protocol of payload net_16 header_checksum; // | checksum of header only (!payload) net_32 source_ip_address; net_32 destination_ip_address; unsigned char payload[0]; // | generic payload } nm_packed ns_plugs_ip_packet; typedef struct { net_8 type; net_8 code; net_16 checksum; unsigned char payload[0]; } nm_packed ns_plugs_icmp_packet; // | (always built on ip) typedef struct { net_16 source_port; net_16 destination_port; net_16 length; // | header + payload length net_16 checksum; // | optional for udp -- 0=unused unsigned char payload[0]; // | generic payload } nm_packed ns_plugs_udp_packet; // | (always built on ip) typedef struct { net_16 source_port; net_16 destination_port; net_32 sequence_number; net_32 acknowledgement_number; net_16 header_length_flags; net_16 window_size; net_16 checksum; net_16 urgent_pointer; unsigned char payload[0]; } nm_packed ns_plugs_tcp_packet; #define nm_ip2h(a,b,c,d) ( \ (((unsigned long)(a)&0xff)<<24) \ | (((unsigned long)(b)&0xff)<<16) \ | (((unsigned long)(c)&0xff)<<8) \ | (((unsigned long)(d)&0xff)<<0) ) #define nm_ip2n(a,b,c,d) ( \ (((unsigned long)(a)&0xff)<<0) \ | (((unsigned long)(b)&0xff)<<8) \ | (((unsigned long)(c)&0xff)<<16) \ | (((unsigned long)(d)&0xff)<<24) ) // +----------------------------------- // | Protocol numbers for plugs in general enum { ne_plugs_ethernet = 1, ne_plugs_arp, ne_plugs_ip, ne_plugs_icmp, ne_plugs_udp, ne_plugs_tcp_raw, ne_plugs_tcp, ne_plugs_last_protocol }; // +----------------------------------- // | Protocol numbers that are part of packets enum { // | // | "type" field for ethernet packet // | ne_plugs_ethernet_arp = 0x0806, ne_plugs_ethernet_ip = 0x0800, // | // | "op" field for arp packet // | ne_plugs_arp_request = 1, ne_plugs_arp_reply = 2, // | // | "type" field for icmp packet // | ne_plugs_icmp_ping_request = 8, ne_plugs_icmp_ping_reply = 0, // | // | "protocol" field for ip packet // | ne_plugs_ip_icmp = 1, ne_plugs_ip_udp = 17, ne_plugs_ip_tcp = 6, // | // | "port" field for udp packet // | ne_plugs_udp_dns = 53 }; // +----------------------------------- // | Flags found in tcp header enum { ne_plugs_flag_tcp_fin = 1, ne_plugs_flag_tcp_syn = 2, ne_plugs_flag_tcp_rst = 4, ne_plugs_flag_tcp_psh = 8, ne_plugs_flag_tcp_ack = 16, ne_plugs_flag_tcp_urg = 32, ne_plugs_flag_tcp_mask = 63 }; // +----------------------------------- // | Flags for nr_plugs_send and ns_plugs_plug.flags // | Also, for nr_plugs_initialize. enum { ne_plugs_flag_adapter_index_mask = 0x000f, // low four bits specify which adapter for plug ne_plugs_flag_ethernet_broadcast = 0x0010, ne_plugs_flag_ethernet_all = 0x0020, ne_plugs_flag_ip_all = 0x0040, // sort of like promiscuous mode, for ip address ne_plugs_flag_debug_rx = 0x0100, // Show all received packets ne_plugs_flag_debug_tx = 0x0200, // Show all transmitted packets ne_plugs_flag_tcp_manual_flow = 0x0400, // Ask TCP sender to back-off. ne_plugs_flag_add_adapter = 0x1000 // (Append additional adapter) }; // +--------------------------------- // | Flags for ns_plugs_network_settings.flags or nr_plugs_initialize #if PLUGS_DHCP enum { ne_plugs_flag_dhcp = 0x2000 // Use only the Ethernet address; rest from dhcp }; #endif // PLUGS_DHCP // +--------------------------------- // | Error Return Values enum { ne_plugs_error_first = -100, ne_plugs_error, ne_plugs_error_not_initialized, ne_plugs_error_feature_disabled, ne_plugs_error_too_many_plugs, ne_plugs_error_unwanted_reply, ne_plugs_error_dns_not_found, ne_plugs_error_dns_timed_out, ne_plugs_error_arp, ne_plugs_error_arp_timed_out, ne_plugs_error_tcp_connection_refused, ne_plugs_error_tcp_timed_out, ne_plugs_error_dhcp_failed }; // +----------------------------------- // | Macros for flipping bytes between // | host and network byte ordering. #define nm_n2h16(_n16_) ((host_16)( ((_n16_) >> 8) + ((_n16_) << 8) )) #define nm_h2n16(_h16_) nm_n2h16(_h16_) #define nm_n2h32(_n32_) ((host_32)( \ (((_n32_) >> 24) & 0x000000ff) \ | (((_n32_) >> 8) & 0x0000ff00) \ | (((_n32_) << 8) & 0x00ff0000) \ | (((_n32_) << 24) & 0xff000000) \ )) #define nm_h2n32(_h32_) nm_n2h32(_h32_) // +---------------------------------------------------------- // | Description of a network adapter // | // | The adapter description is a structure which // | contains pointers to a small handful of routines // | Every routine in the adapter is passed a pointer // | to a structure with some storage for its own // | use. If it's not big enough, the adapter may // | certainly call malloc() and put a pointer in it. // | // | (This is a new field introduced in the NEDK 2.0 // | kit, which supports the lan91c111 part out of the // | box.) // | typedef struct { long d0; long d1; long d2; long d3; } ns_plugs_adapter_storage; // | Routine that the mac adapter calls with a received packet, if any typedef int (*nr_plugs_adapter_dispatch_packet_proc) ( void *raw_packet, int raw_packet_length, void *context ); typedef int (*nr_plugs_adapter_reset_proc) ( void *hardware_base_address, ns_plugs_adapter_storage *adapter_storage, ns_plugs_network_settings *s ); typedef int (*nr_plugs_adapter_set_led_proc) ( void *hardware_base_address, ns_plugs_adapter_storage *adapter_storage, int led_onoff ); typedef int (*nr_plugs_adapter_set_loopback_proc) ( void *hardware_base_address, ns_plugs_adapter_storage *adapter_storage, int loopback_onoff ); typedef int (*nr_plugs_adapter_check_for_events_proc) ( void *hardware_base_address, ns_plugs_adapter_storage *adapter_storage, nr_plugs_adapter_dispatch_packet_proc proc, void *context ); typedef int (*nr_plugs_adapter_tx_frame_proc) ( void *hardware_base_address, ns_plugs_adapter_storage *adapter_storage, char *ethernet_frame, int frame_length ); typedef int (*nr_plugs_adapter_dump_registers_proc) ( void *hardware_base_address, ns_plugs_adapter_storage *adapter_storage ); typedef int (*nr_plugs_adapter_set_promiscuous_proc) ( void *hardware_base_address, ns_plugs_adapter_storage *adapter_storage, int promiscuous_onoff ); typedef int (*nr_plugs_adapter_set_irq_proc) ( void *hardware_base_address, ns_plugs_adapter_storage *adapter_storage, int irq_onoff ); typedef struct { nr_plugs_adapter_reset_proc reset_proc; nr_plugs_adapter_set_led_proc set_led_proc; nr_plugs_adapter_set_loopback_proc set_loopback_proc; nr_plugs_adapter_check_for_events_proc check_for_events_proc; nr_plugs_adapter_tx_frame_proc tx_frame_proc; nr_plugs_adapter_dump_registers_proc dump_registers_proc; nr_plugs_adapter_set_promiscuous_proc set_promiscuous_proc; nr_plugs_adapter_set_irq_proc set_irq_proc; char *adapter_name; } ns_plugs_adapter_description; // +---------------------------------------------------------- // | A plug's callback proc gets the appropriate // | payload, as well as an array with all subprotocols. typedef int (*nr_plugs_receive_callback_proc) ( int plug_handle, void *context, ns_plugs_packet *p, void *payload, int payload_length ); // +---------------------------------------------------------- // | A tcp plug's "listen" proc, where it may choose to // | accept or reject an incoming request typedef int (*nr_plugs_listen_callback_proc) ( int plug_handle, void *context, host_32 remote_ip_address, host_16 remote_port ); // +---------------------------------------------------------- // | High level public routines (called by your application) int nr_plugs_initialize ( long flags, ns_plugs_network_settings *network_settings, void *adapter_base_address, int adapter_irq, ns_plugs_adapter_description *adapter_description ); int nr_plugs_terminate ( void ); int nr_plugs_force_timeout ( void ); int nr_plugs_get_settings ( int adapter_index, ns_plugs_network_settings *network_settings_out ); int nr_plugs_set_mac_loopback ( int adapter_index, int loopback_onoff ); int nr_plugs_set_mac_led ( int adapter_index, int led_onoff // -1 means "default behavior" ); int nr_plugs_create ( int *plug_handle_out, int protocol, host_16 port, nr_plugs_receive_callback_proc callback, void *callback_context, long flags ); int nr_plugs_destroy ( int plug_handle ); int nr_plugs_send ( int plug_handle, void *data, int data_length, long flags ); int nr_plugs_tcp_ready_for_next ( int plug_handle, int window_size ); int nr_plugs_send_to ( int plug_handle, void *data, int data_length, long flags, net_32 ip_address, // | net order net_16 port // | net order ); int nr_plugs_connect ( int plug_handle, char *remote_name, host_32 remote_ip_address, host_16 remote_port ); unsigned int nr_plugs_get_tcp_remote_window_size ( int plug_handle ); int nr_plugs_listen ( int plug_handle, nr_plugs_listen_callback_proc callback, void *callback_context ); int nr_plugs_ip_to_ethernet ( int adapter_index, net_32 ip_address, net_48 *ethernet_address_out, long flags ); int nr_plugs_name_to_ip ( char *remote_name, net_32 *remote_ip_address_out ); int nr_plugs_idle(void); // if not interrupts or timer, call this often int nr_plugs_get_interruptee_pc (void); int nr_plugs_interrupts_enabled (void); int nr_plugs_idle_exclusive (int); // +---------------------------------------------------------- // | Network/Host Byte Ordering Routines // | #define nr_h2n16(n) nr_n2h16((n)) #define nr_h2n32(n) nr_n2h32((n)) host_16 nr_n2h16(net_16 n); host_32 nr_n2h32(net_32 n); // +---------------------------------------------------------- // | Printing Routines for packets & types // | void nr_plugs_print_error_message(char *caption, int error); void nr_plugs_print_ip_address(net_32 ip_address); // prints hex.hex... void nr_plugs_print_ip_address_decimal(net_32 ip_address); // prints hex.hex... void nr_plugs_print_ethernet_address(net_48 *ethernet_address); // prints hex:hex... void nr_plugs_print_ethernet_packet ( ns_plugs_ethernet_packet *p, int length, char *title ); void nr_plugs_print_icmp_packet ( ns_plugs_icmp_packet *p, int length, char *title ); #undef nm_packed #endif // _plugs_ // end of file