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_DNS_AUTO     =  0x1000, /**< DHCPやPPPで取得したDNSサーバを使用する */
133 	NSOC_FLAG_ZEROCONF     =  0x8000  /**< リンクローカルアドレスを取得する */
134 };
135 
136 /**
137  * NSOC_SetInstanceConfig()で使用するインスタンスごとの設定
138  */
139 typedef struct NSOCInstanceConfig {
140     u16         vendor;             /**< ベンダーコード。NSOC_VENDOR_NINTENDOを指定すること */
141     u16         version;            /**< バージョンコード。NSOC_INS_CONF_VERSIONを指定すること */
142 
143     u32         flag;               /**< フラグ。NSOC_FLAG_XXXのORをとったもの */
144     NSOCInAddr  addr;               /**< 自IPアドレス */
145     NSOCInAddr  netmask;            /**< サブネットマスク */
146     NSOCInAddr  router;             /**< デフォルトゲートウエイIPアドレス */
147     s32         mtu;                /**< MTUサイズ */
148 
149     NSOCDNSServerInfo dnsserver;    /**< DNSサーバアドレスリスト */
150 
151 #ifdef NSOC_IP6_ENABLE
152     u8          curHopLimit;     /* ホップリミット */
153     u32         retransTimer;    /* NS再送間隔(msec) */
154     u32         dadNSTransmits;  /* アドアレス重複検査用NS送信回数 */
155     u8          interfaceId[8];  /* インタフェースID */
156 #endif /* NSOC_IP6_ENABLE */
157 } NSOCInstanceConfig;
158 
159 #ifndef NSOC_NO_DEPEND_HEADER
160 /**
161  * NSOC_GetInstanceOpt(), NSOC_SetInstanceOpt()でNSOC_CONFIG_FILTER_INPUT/NSOC_CONFIG_FILTER_OUTPUT使用時の型
162  */
163 typedef BOOL (* NSOCFilter)(NSOCInstancePtr insP, NOSMessageBuf *mbuf);
164 #endif
165 typedef void (* NSOCConfigErrorCallback )(NSOCInstancePtr insP, s32 err);
166 
167 /**
168  * NSOCインスタンスからNNETInstanceを取得する
169  */
NSOC_GetNNETInstance(NSOCInstancePtr insP)170 NN_INLINE NNETInstance *NSOC_GetNNETInstance(NSOCInstancePtr insP)
171 {
172     return (NNETInstance *)insP;
173 }
174 
175 /**
176  * NNETInstanceからNSOCインスタンスを取得する
177  */
NSOC_GetNSOCInstance(NNETInstance * ins)178 NN_INLINE NSOCInstancePtr NSOC_GetNSOCInstance(NNETInstance *ins)
179 {
180     return (NSOCInstancePtr)ins;
181 }
182 
183 /*---------------------------------------------------------------------------*
184  * Function Prototypes
185  *---------------------------------------------------------------------------*/
186 /* nsoc_main.c */
187 extern s32 NSOC_Init(const NNETAllocator *allocator);
188 extern s32 NSOC_Finish(void);
189 extern s32 NSOC_SetCommonConfig(const NSOCCommonConfig *common_conf);
190 extern s32 NSOC_SetInstanceConfig(NSOCInstancePtr ins, const NSOCInstanceConfig *ins_conf);
191 extern s32 NSOC_StartupIns(NNETInstance *ins, s32 timeout);
192 extern s32 NSOC_CleanupIns(NNETInstance *ins, s32 timeout);
193 extern s32 NSOC_AbortIns(NNETInstance *ins);
194 extern s32 NSOC_CreateIns(NSOCInstancePtr *insP);
195 extern s32 NSOC_DestroyIns(NSOCInstancePtr insP);
196 extern s32 NSOC_AttachIF(NSOCInstancePtr insP, NNETEthernetAPI *low_api);
197 extern s32 NSOC_DetachIF(NSOCInstancePtr insP);
198 extern s32 NSOC_SetConfigErrorCallback(NSOCInstancePtr nsoc_insP, NSOCConfigErrorCallback callback);
199 extern s32 NSOC_SetUserInsParam(NSOCInstancePtr insP, void* param);
200 extern s32 NSOC_GetUserInsParam(NSOCInstancePtr insP, void** param);
201 
202 /* nsoc_socket.c */
203 extern int NSOC_GetUserInfo(int s, void** userInfo);
204 extern void NSOC_FreeUserInfo(void* userInfo);
205 extern void* NSOC_DuplicateUserInfo(void* userInfo, int socket);
206 
207 
208 
209 #ifdef  __cplusplus
210 }
211 #endif
212 
213 /* NSOC_ADMIN_H */
214 #endif
215 
216 
217