1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     nsoc_admin.h
4 
5   Copyright (C)2010 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev:$
14  *---------------------------------------------------------------------------*/
15 
16 /**
17  * NSOCモジュール 接続管理プロセス用定義
18  */
19 
20 #ifndef NSOC_ADMIN_H
21 #define NSOC_ADMIN_H
22 
23 #ifndef NSOC_NO_DEPEND_HEADER
24 #include <nn/net/compatible/nos/nos.h>			/* for NOSxxxx */
25 #include <nn/net/compatible/nnet/nnet.h>			/* for NNETxxxx */
26 #include <nn/net/compatible/nsoc/nsoc_user.h>		/* for NSOCInAddr, NSOCDNSServerInfo */
27 #endif
28 
29 #ifdef  __cplusplus
30 extern "C" {
31 #endif
32 
33 /*---------------------------------------------------------------------------*
34  * Definitions
35  *---------------------------------------------------------------------------*/
36 
37 #define NSOC_VENDOR_NINTENDO        0x0000  /**< 本実装が対応している設定のベンダーコード */
38 #define NSOC_COMMON_CONF_VERSION    0x3100  /**< 本実装が対応している全体設定のバージョン */
39 #define NSOC_INS_CONF_VERSION       0x4100  /**< 本実装が対応しているインスタンス設定のバージョン */
40 
41 /**
42  * NSOCモジュールのエラーコード
43  */
44 #define NSOC_ERROR_BASE                          0xffff8000
45 #define NSOC_ERROR_CODE(code)                    ((s32)(NSOC_ERROR_BASE|(code)))
46 
47 enum NSOCErrorCode {
48     NSOC_ERR_PARAM          = NSOC_ERROR_CODE(1),       /**< パラメータエラー */
49     NSOC_ERR_INIT           = NSOC_ERROR_CODE(2),       /**< 初期状態のため実行不可 */
50     NSOC_ERR_FINISH         = NSOC_ERROR_CODE(3),       /**< 終了状態のため実行不可 */
51     NSOC_ERR_CONFVER        = NSOC_ERROR_CODE(4),       /**< 設定のバージョンエラー */
52     NSOC_ERR_STATE          = NSOC_ERROR_CODE(5),       /**< ステートエラー */
53     NSOC_ERR_EXIST          = NSOC_ERROR_CODE(6),       /**< 既に作成済み */
54     NSOC_ERR_NOMEM          = NSOC_ERROR_CODE(7),       /**< メモリ不足 */
55     NSOC_ERR_NOS            = NSOC_ERROR_CODE(8),       /**< OSサービス関数がエラーを返した */
56     NSOC_ERR_LOWER          = NSOC_ERROR_CODE(9),       /**< 下位レイヤからのエラー */
57     NSOC_ERR_TIMEOUT        = NSOC_ERROR_CODE(10),      /**< タイムアウト */
58     NSOC_ERR_INS_RESOURCES  = NSOC_ERROR_CODE(11),      /**< OSリソース確保失敗 */
59     NSOC_ERR_MAXSOCKET      = NSOC_ERROR_CODE(12),      /**< ソケット数が最大に達した */
60     NSOC_ERR_ABORT          = NSOC_ERROR_CODE(13),      /**< アボートされた */
61 
62     NSOC_ERR_IP_UNREACHABLE = NSOC_ERROR_CODE(21),      /**< 到達できなかった */
63     NSOC_ERR_IP_DATASIZE    = NSOC_ERROR_CODE(22),      /**< データサイズ不正 */
64     NSOC_ERR_IP_NETDOWN     = NSOC_ERROR_CODE(23),      /**< ネットワークダウン */
65     NSOC_ERR_IP_INVALID     = NSOC_ERROR_CODE(24),      /**< 不正パラメータ */
66     NSOC_ERR_IP_REFUSED     = NSOC_ERROR_CODE(25),      /**< 処理の拒否 */
67     NSOC_ERR_IP_TIMEOUT     = NSOC_ERROR_CODE(26),      /**< タイムアウト */
68     NSOC_ERR_IP_CANCELED    = NSOC_ERROR_CODE(27),      /**< キャンセル */
69     NSOC_ERR_IP_BUSY        = NSOC_ERROR_CODE(28),      /**< ビジー */
70     NSOC_ERR_IP_CLOSING     = NSOC_ERROR_CODE(29),      /**< ソケットを閉じた */
71     NSOC_ERR_IP_EXIST       = NSOC_ERROR_CODE(30),      /**< 既に存在する */
72     NSOC_ERR_IP_RESET       = NSOC_ERROR_CODE(31),      /**< リセットを受けた */
73     NSOC_ERR_IP_NOT_EXIST   = NSOC_ERROR_CODE(32),      /**< 最早存在しない */
74     NSOC_ERR_IP_INV_SOCKET  = NSOC_ERROR_CODE(33),      /**< 無効なソケット */
75     NSOC_ERR_IP_AGAIN       = NSOC_ERROR_CODE(34),      /**< 実行中 */
76     NSOC_ERR_IP_SOCKET_UNSPECIFIED = NSOC_ERROR_CODE(35),   /**< ソケットが指定されていない */
77     NSOC_ERR_IP_SOURCE_QUENCH = NSOC_ERROR_CODE(36),    /**< 送信抑制 */
78     NSOC_ERR_IP_INV_OPTION  = NSOC_ERROR_CODE(37),      /**< 不正なオプション */
79     NSOC_ERR_IP_ADDR_COLLISION = NSOC_ERROR_CODE(38),   /**< IPアドレス重複 */
80     NSOC_ERR_IP_SHUTDOWN    = NSOC_ERROR_CODE(39),      /**< シャットダウン状態 */
81     NSOC_ERR_IP_INV_HEADER  = NSOC_ERROR_CODE(40),      /**< 不正なIPヘッダ */
82     NSOC_ERR_IP_INV_ADDR    = NSOC_ERROR_CODE(41),      /**< 不正なIPアドレス */
83     NSOC_ERR_IP_INV_DATA    = NSOC_ERROR_CODE(42),      /**< 不正なIPデータ */
84 
85     NSOC_ERR_DHCP_EXPIRED   = NSOC_ERROR_CODE(51),      /**< DHCPリース時間満了 */
86     NSOC_ERR_DHCP_TIMEOUT   = NSOC_ERROR_CODE(52),      /**< DHCPタイムアウト */
87     NSOC_ERR_DHCP_NAK       = NSOC_ERROR_CODE(53),      /**< DHCPのNAKを受信 */
88 
89     NSOC_ERR_IP6_ADDR_COLLISION = NSOC_ERROR_CODE(60),  /**< IPv6アドレス重複 */
90 
91     NSOC_ERR_NONE           = 0                         /**< 正常終了 */
92 };
93 
94 /*---------------------------------------------------------------------------*
95  * Types/Declarations
96  *---------------------------------------------------------------------------*/
97 /**
98  * NSOC_set_common_config()で使用するモジュール全体の設定構造体
99  */
100 typedef struct NSOCCommonConfig {
101     u16         vendor;             /**< ベンダーコード。NSOC_VENDOR_NINTENDOを指定すること */
102     u16         version;            /**< バージョンコード。NSOC_COMMON_CONF_VERSIONを指定すること */
103 
104     s32         timeWaitBuffer;     /**< TCPのTIME-WAITソケットを保持するためのバッファサイズ */
105 
106     s32         reassembleMtu;      /**< 再構築後の最大IPパケットサイズ */
107 
108     // TCP
109     s32         rwin;               /**< TCP受信ウインドウサイズ(default 2 x MSS) */
110     s32         r2;                 /**< TCP再送のトータル時間(default 100 sec) */
111 
112     // UDP
113     s32         udpRecvBuff;        /**< UDP受信バッファサイズ(default 4416 byte) */
114 
115     // DHCP
116     const char* hostName;           /**< DHCPで使用するホスト名へのポインタ */
117     s32         rdhcp;              /**< DHCP再送回数(default 4) */
118 
119 } NSOCCommonConfig;
120 
121 /*
122  * NSOCInstanceConfigのflagにセットするフラグ
123  */
124 enum NSOCInstanceConfigFlag {
125 	NSOC_FLAG_DHCP         =  0x0001, /**< DHCPによるIPアドレス取得 */
126 	NSOC_FLAG_PPP          =  0x0002, /**< PPPによるIPアドレス取得 */
127 	NSOC_FLAG_IP4          =  0x0004, /**< IPv4を有効にする */
128 	NSOC_FLAG_IP6          =  0x0008, /**< IPv6を有効にする */
129 	NSOC_FLAG_DHCP6        =  0x0010, /**< DHCPv6によるIPv6アドレス取得 */
130 	NSOC_FLAG_NORA_DHCP6   =  0x0020, /**< NDP RAが受信されないとき、DHCPv6を起動する */
131 	NSOC_FLAG_DHCP_REBOOT  =  0x0100, /**< DHCPでのIPアドレス取得失敗時に再度実行する */
132 	NSOC_FLAG_DHCP_RELEASE =  0x0200, /**< NSOC_CleanupIns()実行時に、DHCP Releaseを送信する */
133 	NSOC_FLAG_DNS_AUTO     =  0x1000, /**< DHCPやPPPで取得したDNSサーバを使用する */
134 	NSOC_FLAG_ZEROCONF     =  0x8000  /**< リンクローカルアドレスを取得する */
135 };
136 
137 /**
138  * NSOC_SetInstanceConfig()で使用するインスタンスごとの設定
139  */
140 typedef struct NSOCInstanceConfig {
141     u16         vendor;             /**< ベンダーコード。NSOC_VENDOR_NINTENDOを指定すること */
142     u16         version;            /**< バージョンコード。NSOC_INS_CONF_VERSIONを指定すること */
143 
144     u32         flag;               /**< フラグ。NSOC_FLAG_XXXのORをとったもの */
145     NSOCInAddr  addr;               /**< 自IPアドレス */
146     NSOCInAddr  netmask;            /**< サブネットマスク */
147     NSOCInAddr  router;             /**< デフォルトゲートウエイIPアドレス */
148     s32         mtu;                /**< MTUサイズ */
149 
150     NSOCDNSServerInfo dnsserver;    /**< DNSサーバアドレスリスト */
151 
152 #ifdef NSOC_IP6_ENABLE
153     u8          curHopLimit;     /* ホップリミット */
154     u32         retransTimer;    /* NS再送間隔(msec) */
155     u32         dadNSTransmits;  /* アドアレス重複検査用NS送信回数 */
156     u8          interfaceId[8];  /* インタフェースID */
157 #endif /* NSOC_IP6_ENABLE */
158 } NSOCInstanceConfig;
159 
160 /**
161  * NSOCインスタンスで発生したエラーを通知するコールバック関数
162  */
163 typedef void (* NSOCConfigErrorCallback )(NSOCInstancePtr insP, s32 err);
164 
165 #ifndef NSOC_NO_DEPEND_HEADER
166 /**
167  * NSOC_GetInstanceOpt(), NSOC_SetInstanceOpt()でNSOC_CONFIG_FILTER_INPUT/NSOC_CONFIG_FILTER_OUTPUT使用時の型
168  */
169 typedef BOOL (* NSOCFilter)(NSOCInstancePtr insP, NOSMessageBuf *mbuf);
170 #endif
171 
172 /**
173  * NSOCインスタンスからNNETInstanceを取得する
174  */
NSOC_GetNNETInstance(NSOCInstancePtr insP)175 NN_INLINE NNETInstance *NSOC_GetNNETInstance(NSOCInstancePtr insP)
176 {
177     return (NNETInstance *)insP;
178 }
179 
180 /**
181  * NNETInstanceからNSOCインスタンスを取得する
182  */
NSOC_GetNSOCInstance(NNETInstance * ins)183 NN_INLINE NSOCInstancePtr NSOC_GetNSOCInstance(NNETInstance *ins)
184 {
185     return (NSOCInstancePtr)ins;
186 }
187 
188 /*---------------------------------------------------------------------------*
189  * Function Prototypes
190  *---------------------------------------------------------------------------*/
191 /* nsoc_main.c */
192 extern s32 NSOC_Init(const NNETAllocator *allocator);
193 extern s32 NSOC_Finish(void);
194 extern s32 NSOC_SetCommonConfig(const NSOCCommonConfig *common_conf);
195 extern s32 NSOC_SetInstanceConfig(NSOCInstancePtr ins, const NSOCInstanceConfig *ins_conf);
196 extern s32 NSOC_StartupIns(NNETInstance *ins, s32 timeout);
197 extern s32 NSOC_CleanupIns(NNETInstance *ins, s32 timeout);
198 extern s32 NSOC_AbortIns(NNETInstance *ins);
199 extern s32 NSOC_CreateIns(NSOCInstancePtr *insP);
200 extern s32 NSOC_DestroyIns(NSOCInstancePtr insP);
201 extern s32 NSOC_AttachIF(NSOCInstancePtr insP, NNETEthernetAPI *low_api);
202 extern s32 NSOC_DetachIF(NSOCInstancePtr insP);
203 extern s32 NSOC_SetConfigErrorCallback(NSOCInstancePtr nsoc_insP, NSOCConfigErrorCallback callback);
204 extern s32 NSOC_SetUserInsParam(NSOCInstancePtr insP, void* param);
205 extern s32 NSOC_GetUserInsParam(NSOCInstancePtr insP, void** param);
206 
207 /* nsoc_socket.c */
208 extern int NSOC_GetUserInfo(int s, void** userInfo);
209 extern void NSOC_FreeUserInfo(void* userInfo);
210 extern void* NSOC_DuplicateUserInfo(void* userInfo, int socket);
211 
212 
213 
214 #ifdef  __cplusplus
215 }
216 #endif
217 
218 /* NSOC_ADMIN_H */
219 #endif
220 
221 
222