00001 #ifndef __SIM_INTERFACE_H__
00002 #define __SIM_INTERFACE_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #define NSC_VERSION 0x000500
00024
00025 struct INetStack
00026 {
00027 virtual ~INetStack() {}
00028
00029 virtual void init(int hz) = 0;
00030
00031 virtual void if_receive_packet(int if_id, const void *data, int datalen) = 0;
00032
00033 virtual void if_send_packet(const void *data, int datalen) = 0;
00034 virtual void if_send_finish(int if_id) = 0;
00035
00036 virtual void if_attach(const char *addr, const char *mask, int mtu) = 0;
00037 virtual void add_default_gateway(const char *addr) = 0;
00038
00039
00040
00041
00042 virtual int get_id() = 0;
00043
00044
00045
00046
00047 virtual const char *get_name() = 0;
00048
00049
00050
00051
00052
00053
00054
00055 virtual int get_hz() = 0;
00056
00057 virtual void timer_interrupt() = 0;
00058 virtual void increment_ticks() = 0;
00059
00060 virtual void buffer_size(int size) = 0;
00061
00062 virtual struct INetDatagramSocket *new_udp_socket() { return NULL; }
00063 virtual struct INetStreamSocket *new_tcp_socket() { return NULL; }
00064 virtual struct INetStreamSocket *new_sctp_socket() { return NULL; }
00065
00066
00067
00068 virtual int sysctl(const char *sysctl_name, void *oldval, size_t *oldlenp,
00069 void *newval, size_t newlen)
00070 {
00071 return -1;
00072 }
00073
00074
00075
00076
00077
00078 virtual int sysctl_set(const char *name, const char *value)
00079 {
00080 return -1;
00081 }
00082
00083
00084
00085
00086 virtual int sysctl_get(const char *name, char *value, size_t len)
00087 {
00088 return -1;
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098 virtual int sysctl_getnum(size_t idx, char *name, size_t len)
00099 {
00100 return -1;
00101 }
00102
00103 virtual void show_config()
00104 {
00105 ;
00106 }
00107
00108
00109 virtual bool get_var(const char *var, char *result, int result_len)
00110 {
00111 return false;
00112 }
00113
00114 virtual bool set_var(const char *var, const char *val)
00115 {
00116 return false;
00117 }
00118
00119
00120
00121
00122 virtual void set_diagnostic(int level) {}
00123
00124
00125
00126
00127
00128 virtual int cmd(const char *)
00129 {
00130 return 1;
00131 }
00132 };
00133
00134 struct INetStreamSocket
00135 {
00136 virtual ~INetStreamSocket() {}
00137
00138 virtual void connect(const char *, int) = 0;
00139 virtual void disconnect() = 0;
00140 virtual void listen(int) = 0;
00141 virtual int accept(INetStreamSocket **) = 0;
00142 virtual int send_data(const void *data, int datalen) = 0;
00143 virtual int read_data(void *buf, int *buflen) = 0;
00144
00145
00146
00147 virtual int setsockopt(char *optname, void *val, size_t valsize) = 0;
00148 virtual void print_state(FILE *) = 0;
00149 virtual bool is_connected() = 0;
00150 virtual bool is_listening() = 0;
00151
00152 virtual int getpeername(struct sockaddr *sa, size_t *salen) {
00153 return -1;
00154 }
00155 virtual int getsockname(struct sockaddr *sa, size_t *salen) {
00156 return -1;
00157 }
00158
00159
00160 virtual bool get_var(const char *var, char *result, int result_len)
00161 {
00162 return false;
00163 }
00164
00165 virtual bool set_var(const char *var, const char *val)
00166 {
00167 return false;
00168 }
00169 };
00170
00171 struct INetDatagramSocket
00172 {
00173 virtual ~INetDatagramSocket() {}
00174
00175 virtual void set_destination(const char *, int) = 0;
00176 virtual void send_data(const void *data, int datalen) = 0;
00177 };
00178 struct ISendCallback
00179 {
00180 virtual ~ISendCallback() {}
00181
00182 virtual void send_callback(const void *data, int datalen) = 0;
00183 };
00184
00185 struct IInterruptCallback
00186 {
00187 virtual ~IInterruptCallback() {}
00188
00189 virtual void wakeup() = 0;
00190 virtual void gettime(unsigned int *, unsigned int *) = 0;
00191 };
00192
00193 typedef int (*FRandom)();
00194 typedef INetStack *(*FCreateStack)(ISendCallback *, IInterruptCallback *,
00195 FRandom);
00196
00197 #define CREATE_STACK_FUNC(a,b,c) extern "C" INetStack *nsc_create_stack(\
00198 ISendCallback *a, IInterruptCallback *b, FRandom c)
00199
00200 #endif