/* * TOPPERS ECHONET Lite Communication Middleware * * Copyright (C) 2015 Cores Co., Ltd. Japan * * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー * スコード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 * の無保証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ * と. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 * 作権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに * 報告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを * 免責すること. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ * の責任を負わない. * * @(#) $Id: websocket.h 270 2017-02-09 04:03:47Z coas-nagasima $ */ #ifndef WEBSOCKET_H #define WEBSOCKET_H #include #include #include "t_stddef.h" #define NUM_ECHONET_MEMPOOL_BLOCK (60) /* 電文用メモリブロックの数 */ #define ECHONET_MEMPOOL_BLOCK_SIZE (256) /* 電文用メモリブロックのサイズ */ /* T_EDATA管理領域サイズ */ #define DEF_ECN_EDT_HDR_LEN (sizeof(intptr_t)) /* 管理領域サイズ(64byte - sizeof(T_MSG)) */ /* #define DEF_ECN_FBS_LIB_HDR_LEN ((ECHONET_MEMPOOL_BLOCK_SIZE + sizeof(int) - 1)>> 2) // */ #define DEF_ECN_FBS_LIB_HDR_LEN (64 - DEF_ECN_EDT_HDR_LEN) /* 管理領域を含むブロックに保持するデータサイズ */ #define DEF_ECN_FBS_FST_DAT_LEN (64) /* リンクポインタ配列のサイズ(byte) */ #define DEF_ECN_FBS_LNK_LEN (ECHONET_MEMPOOL_BLOCK_SIZE - DEF_ECN_EDT_HDR_LEN - DEF_ECN_FBS_LIB_HDR_LEN - DEF_ECN_FBS_FST_DAT_LEN) /* 固定長バッファ最大サイズ */ #define DEF_ECN_FBS_BUF_MAXLEN ((DEF_ECN_FBS_LNK_LEN / sizeof(void *)) * ECHONET_MEMPOOL_BLOCK_SIZE + DEF_ECN_FBS_FST_DAT_LEN) /* 子要素バッファのサイズ */ #define DEF_ECN_FBS_SUB_BUF_LEN ECHONET_MEMPOOL_BLOCK_SIZE /* リンクポインタ配列に列挙される、子要素バッファ */ typedef struct { uint8_t payload[ECHONET_MEMPOOL_BLOCK_SIZE]; } T_ECN_SUB_BLK; /* リンクポインタ配列 */ typedef union { T_ECN_SUB_BLK *p_sub[DEF_ECN_FBS_LNK_LEN / sizeof(T_ECN_SUB_BLK *)]; uint8_t bin[DEF_ECN_FBS_LNK_LEN]; } T_ECN_FBS_LNK; /* 管理領域(64byte - sizeof(T_MSG)) */ typedef struct { uint16_t length; /* メッセージ長 */ uint16_t type; /* メッセージタイプ */ union { ID mbxid; /* 送信元メールボックスID(内部メッセージ) */ }sender; union { ID mbxid; /* 送信先メールボックスID(内部メッセージ) */ }target; union { ID mbxid; /* 返信先メールボックスID(内部メッセージ) */ }reply; int rd; /* 読み取りヘッド情報 */ int wr; /* 書き込みヘッド情報 */ } T_ECN_FBS_HDR; /* 管理領域を含むブロックの構造 */ typedef struct { uint8_t _msg[DEF_ECN_EDT_HDR_LEN]; /* T_MSG */ T_ECN_FBS_HDR hdr; /* 管理領域 64byte - sizeof(T_MSG) */ uint8_t _gap[DEF_ECN_FBS_LIB_HDR_LEN - sizeof(T_ECN_FBS_HDR)]; T_ECN_FBS_LNK lnk; /* リンクポインタ配列 128byte */ uint8_t payload[DEF_ECN_FBS_FST_DAT_LEN]; } T_ECN_FST_BLK; /* FBS-ID */ typedef struct ecn_fbs_id_strc { T_ECN_FST_BLK *ptr; } ECN_FBS_ID; ER _ecn_fbs_cre(size_t fa_req_size, ECN_FBS_ID *fp_id); ER _ecn_fbs_del(ECN_FBS_ID fa_id); size_t _ecn_fbs_get_datalen(ECN_FBS_ID fa_id); int _ecn_fbs_peek(ECN_FBS_ID fa_id, size_t fa_seek); ER _ecn_fbs_poke(ECN_FBS_ID fa_id, size_t fa_seek, int fa_val); extern ID ecn_api_mailboxid; extern ID WEBSOCKET_MBXID; typedef struct ws_state { int state; int fin; enum opecode_t { continuation_frame = 0, text_frame = 1, binary_frame = 2, connection_close = 8, ping = 9, pong = 10 } opecode; int payload_len; int masked; char masking_key[4]; int data_pos; } ws_state_t; struct websocket { ID wbsid; ws_state_t wstate; ws_state_t rstate; ECN_FBS_ID cur_in_msg; }; void websocket_init(struct websocket *ws, ID wbsid); void websocket_destroy(struct websocket *ws); struct websocket *websocket_getws(ID wbsid); int websocket_input(struct websocket *ws, const void *data, int len); bool_t websocket_newdata(struct websocket *ws); int websocket_output(struct websocket *ws, void *data, int len); #endif /* WEBSOCKET_H */