mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-05-14 12:29:37 +08:00
315 lines
8.7 KiB
C
315 lines
8.7 KiB
C
/**
|
|
* @file rtems/rtems_bsdnet.h
|
|
*/
|
|
|
|
|
|
#ifndef _RTEMS_BSDNET_H
|
|
#define _RTEMS_BSDNET_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <rtems.h>
|
|
|
|
/*
|
|
* If this file is included from inside the Network Stack proper or
|
|
* a device driver, then __INSIDE_RTEMS_BSD_TCPIP_STACK__ should be
|
|
* defined. This triggers a number of internally used definitions.
|
|
*/
|
|
|
|
#if defined(__INSIDE_RTEMS_BSD_TCPIP_STACK__)
|
|
#undef _KERNEL
|
|
#undef INET
|
|
#undef NFS
|
|
#undef DIAGNOSTIC
|
|
#undef BOOTP_COMPAT
|
|
#undef __BSD_VISIBLE
|
|
|
|
#define _KERNEL
|
|
#define INET
|
|
#define NFS
|
|
#define DIAGNOSTIC
|
|
#define BOOTP_COMPAT
|
|
#define __BSD_VISIBLE 1
|
|
#endif
|
|
|
|
/*
|
|
* Values that may be obtained by BOOTP
|
|
*/
|
|
extern struct in_addr rtems_bsdnet_bootp_server_address;
|
|
extern char *rtems_bsdnet_bootp_server_name;
|
|
extern char *rtems_bsdnet_bootp_boot_file_name;
|
|
extern char *rtems_bsdnet_bootp_cmdline;
|
|
extern int32_t rtems_bsdnet_timeoffset;
|
|
|
|
/*
|
|
* Manipulate routing tables
|
|
*/
|
|
struct sockaddr;
|
|
struct rtentry;
|
|
int rtems_bsdnet_rtrequest (
|
|
int req,
|
|
struct sockaddr *dst,
|
|
struct sockaddr *gateway,
|
|
struct sockaddr *netmask,
|
|
int flags,
|
|
struct rtentry **net_nrt);
|
|
|
|
/*
|
|
* Diagnostics
|
|
*/
|
|
void rtems_bsdnet_show_inet_routes (void);
|
|
void rtems_bsdnet_show_mbuf_stats (void);
|
|
void rtems_bsdnet_show_if_stats (void);
|
|
void rtems_bsdnet_show_ip_stats (void);
|
|
void rtems_bsdnet_show_icmp_stats (void);
|
|
void rtems_bsdnet_show_udp_stats (void);
|
|
void rtems_bsdnet_show_tcp_stats (void);
|
|
|
|
/*
|
|
* Network configuration
|
|
*/
|
|
struct rtems_bsdnet_ifconfig {
|
|
/*
|
|
* These three entries must be supplied for each interface.
|
|
*/
|
|
char *name;
|
|
|
|
/*
|
|
* This function now handles attaching and detaching an interface.
|
|
* The parameter attaching indicates the operation being invoked.
|
|
* For older attach functions which do not have the extra parameter
|
|
* it will be ignored.
|
|
*/
|
|
int (*attach)(struct rtems_bsdnet_ifconfig *conf, int attaching);
|
|
|
|
/*
|
|
* Link to next interface
|
|
*/
|
|
struct rtems_bsdnet_ifconfig *next;
|
|
|
|
/*
|
|
* The following entries may be obtained
|
|
* from BOOTP or explicitily supplied.
|
|
*/
|
|
char *ip_address;
|
|
char *ip_netmask;
|
|
void *hardware_address;
|
|
|
|
/*
|
|
* The driver assigns defaults values to the following
|
|
* entries if they are not explicitly supplied.
|
|
*/
|
|
int ignore_broadcast;
|
|
int mtu;
|
|
int rbuf_count;
|
|
int xbuf_count;
|
|
|
|
/*
|
|
* For external ethernet controller board the following
|
|
* parameters are needed
|
|
*/
|
|
unsigned int port; /* port of the board */
|
|
unsigned int irno; /* irq of the board */
|
|
unsigned int bpar; /* memory of the board */
|
|
|
|
/*
|
|
* Driver control block pointer. Typcially this points to the driver's
|
|
* controlling structure. You set this when you have the structure allocated
|
|
* externally to the driver.
|
|
*/
|
|
void *drv_ctrl;
|
|
|
|
};
|
|
|
|
struct rtems_bsdnet_config {
|
|
/*
|
|
* This entry points to the head of the ifconfig chain.
|
|
*/
|
|
struct rtems_bsdnet_ifconfig *ifconfig;
|
|
|
|
/*
|
|
* This entry should be rtems_bsdnet_do_bootp if BOOTP
|
|
* is being used to configure the network, and NULL
|
|
* if BOOTP is not being used.
|
|
*/
|
|
void (*bootp)(void);
|
|
|
|
/*
|
|
* The remaining items can be initialized to 0, in
|
|
* which case the default value will be used.
|
|
*/
|
|
rtems_task_priority network_task_priority; /* 100 */
|
|
unsigned long mbuf_bytecount; /* 64 kbytes */
|
|
unsigned long mbuf_cluster_bytecount; /* 128 kbytes */
|
|
char *hostname; /* BOOTP */
|
|
char *domainname; /* BOOTP */
|
|
char *gateway; /* BOOTP */
|
|
char *log_host; /* BOOTP */
|
|
char *name_server[3]; /* BOOTP */
|
|
char *ntp_server[3]; /* BOOTP */
|
|
/*
|
|
* Default "multiplier" on buffer size. This is
|
|
* claimed by the TCP/IP implementation to be for
|
|
* efficiency but you will have to measure the
|
|
* benefit for buffering beyond double buffering
|
|
* in your own application.
|
|
*
|
|
* The default value is 2.
|
|
*
|
|
* See kern/uipc_socket2.c for details.
|
|
*/
|
|
unsigned long sb_efficiency;
|
|
/*
|
|
* Default UDP buffer sizes PER SOCKET!!
|
|
*
|
|
* TX = 9216 -- max datagram size
|
|
* RX = 40 * (1024 + sizeof(struct sockaddr_in))
|
|
*
|
|
* See netinet/udp_usrreq.c for details
|
|
*/
|
|
unsigned long udp_tx_buf_size;
|
|
unsigned long udp_rx_buf_size;
|
|
/*
|
|
* Default UDP buffer sizes PER SOCKET!!
|
|
*
|
|
* TX = 16 * 1024
|
|
* RX = 16 * 1024
|
|
*
|
|
* See netinet/tcp_usrreq.c for details
|
|
*/
|
|
unsigned long tcp_tx_buf_size;
|
|
unsigned long tcp_rx_buf_size;
|
|
};
|
|
|
|
/*
|
|
* Default global device configuration structure. This is scanned
|
|
* by the initialize network function. Check the network demo's for
|
|
* an example of the structure. Like the RTEMS configuration tables,
|
|
* they are not part of RTEMS but part of your application or bsp
|
|
* code.
|
|
*/
|
|
extern struct rtems_bsdnet_config rtems_bsdnet_config;
|
|
|
|
/*
|
|
* Initialise the BSD stack, attach and `up' interfaces
|
|
* in the `rtems_bsdnet_config'. RTEMS must already be initialised.
|
|
*/
|
|
int rtems_bsdnet_initialize_network (void);
|
|
|
|
/*
|
|
* Dynamic interface control. Drivers must free any resources such as
|
|
* memory, interrupts, io regions claimed during the `attach' and/or
|
|
* `up' operations when asked to `detach'.
|
|
* You must configure the interface after attaching it.
|
|
*/
|
|
void rtems_bsdnet_attach (struct rtems_bsdnet_ifconfig *ifconfig);
|
|
void rtems_bsdnet_detach (struct rtems_bsdnet_ifconfig *ifconfig);
|
|
|
|
/*
|
|
* Interface configuration. The commands are listed in `sys/sockio.h'.
|
|
*/
|
|
int rtems_bsdnet_ifconfig (const char *ifname, uint32_t cmd, void *param);
|
|
|
|
void rtems_bsdnet_do_bootp (void);
|
|
void rtems_bsdnet_do_bootp_and_rootfs (void);
|
|
|
|
/* NTP tuning parameters */
|
|
extern int rtems_bsdnet_ntp_retry_count;
|
|
extern int rtems_bsdnet_ntp_timeout_secs;
|
|
extern int rtems_bsdnet_ntp_bcast_timeout_secs;
|
|
|
|
|
|
struct timestamp {
|
|
uint32_t integer;
|
|
uint32_t fraction;
|
|
};
|
|
|
|
/* Data is passed in network byte order */
|
|
struct ntpPacketSmall {
|
|
uint8_t li_vn_mode;
|
|
uint8_t stratum;
|
|
int8_t poll_interval;
|
|
int8_t precision;
|
|
int32_t root_delay;
|
|
int32_t root_dispersion;
|
|
char reference_identifier[4];
|
|
struct timestamp reference_timestamp;
|
|
struct timestamp originate_timestamp;
|
|
struct timestamp receive_timestamp;
|
|
struct timestamp transmit_timestamp;
|
|
};
|
|
|
|
/* NOTE: packet data is *only* accessible from the callback
|
|
*
|
|
* 'callback' is invoked twice, once prior to sending a request
|
|
* to the server and one more time after receiving a valid reply.
|
|
* This allows for the user to measure round-trip times.
|
|
*
|
|
* Semantics of the 'state' parameter:
|
|
*
|
|
* state == 1: 1st call, just prior to sending request. The
|
|
* packet has been set up already but may be
|
|
* modified by the callback (e.g. to set the originate
|
|
* timestamp).
|
|
* state == -1: 1st call - no request will be sent but we'll
|
|
* wait for a reply from a broadcast server. The
|
|
* packet has not been set up.
|
|
* state == 0: 2nd call. The user is responsible for keeping track
|
|
* of the 'state' during the first call in order to
|
|
* know if it makes sense to calculate 'round-trip' times.
|
|
*
|
|
* RETURN VALUE: the callback should return 0 if processing the packet was
|
|
* successful and -1 on error in which case rtems_bsdnet_get_ntp()
|
|
* may try another server.
|
|
*/
|
|
typedef int (*rtems_bsdnet_ntp_callback_t)(
|
|
struct ntpPacketSmall *packet,
|
|
int state,
|
|
void *usr_data);
|
|
|
|
/* Obtain time from a NTP server and call user callback to process data;
|
|
* socket parameter may be -1 to request the routine to open and close its own socket.
|
|
* Networking parameters as configured are used...
|
|
*
|
|
* It is legal to pass a NULL callback pointer. In this case, a default callback
|
|
* is used which determines the current time by contacting an NTP server. The current
|
|
* time is converted to a 'struct timespec' (seconds/nanoseconds) and passed into *usr_data.
|
|
* The caller is responsible for providing a memory area >= sizeof(struct timespec).
|
|
*
|
|
* RETURNS: 0 on success, -1 on failure.
|
|
*/
|
|
int rtems_bsdnet_get_ntp(int socket, rtems_bsdnet_ntp_callback_t callback, void *usr_data);
|
|
|
|
int rtems_bsdnet_synchronize_ntp (int interval, rtems_task_priority priority);
|
|
|
|
/*
|
|
* Callback to report BSD malloc starvation.
|
|
* The default implementation just prints a message but an application
|
|
* can provide its own version.
|
|
*/
|
|
void rtems_bsdnet_malloc_starvation(void);
|
|
|
|
/*
|
|
* mbuf malloc interface to enable custom allocation of mbuf's
|
|
*
|
|
* May be declared in user code. If not, then the default is to
|
|
* malloc.
|
|
*/
|
|
void* rtems_bsdnet_malloc_mbuf(size_t size, int type);
|
|
|
|
/*
|
|
* Possible values of the type parameter to rtems_bsdnet_malloc_mbuf to assist
|
|
* in allocation of the structure.
|
|
*/
|
|
#define MBUF_MALLOC_NMBCLUSTERS (0)
|
|
#define MBUF_MALLOC_MCLREFCNT (1)
|
|
#define MBUF_MALLOC_MBUF (2)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _RTEMS_BSDNET_H */
|