*/\r
#define NyLPC_cNetConfig_finalize(i_inst);\r
\r
-#define NyLPC_cNetConfig_setIpAddr(i_inst,ip1,ip2,ip3,ip4) NyLPC_TIPv4Addr_set(&((i_inst)->interface_setting.ethernet.ip_addr),(ip1),(ip2),(ip3),(ip4));\r
+#define NyLPC_cNetConfig_setIpAddr(i_inst,ip1,ip2,ip3,ip4) NyLPC_TIPv4Addr_set(&((i_inst)->super.ip_addr),(ip1),(ip2),(ip3),(ip4));\r
\r
/**\r
* Set IPv4 network mask value to instance.\r
*/\r
-#define NyLPC_cNetConfig_setNetMask(i_inst,ip1,ip2,ip3,ip4) NyLPC_TIPv4Addr_set(&((i_inst)->interface_setting.ethernet.netmask),(ip1),(ip2),(ip3),(ip4));\r
+#define NyLPC_cNetConfig_setNetMask(i_inst,ip1,ip2,ip3,ip4) NyLPC_TIPv4Addr_set(&((i_inst)->super.netmask),(ip1),(ip2),(ip3),(ip4));\r
\r
/**\r
* Set IPv4 default gateway address to instance.\r
*/\r
-#define NyLPC_cNetConfig_setGateway(i_inst,ip1,ip2,ip3,ip4) NyLPC_TIPv4Addr_set(&((i_inst)->interface_setting.ethernet.dr_addr),(ip1),(ip2),(ip3),(ip4));\r
+#define NyLPC_cNetConfig_setGateway(i_inst,ip1,ip2,ip3,ip4) NyLPC_TIPv4Addr_set(&((i_inst)->super.dr_addr),(ip1),(ip2),(ip3),(ip4));\r
\r
/**\r
* Set ethernet mac address to instance.\r
/** 文字列のパーサ*/\r
NyLPC_TcMiMicDbCompiler_t _binparser;\r
union{\r
- struct{\r
- /**pパラメータ。最大長さは16。\r
- * 詳細はNyLPC_TcModMiMicSetting_tを参照\r
+ /**\r
+ * スタックサイズ削減のための構造体。tmpは受信処理に使用。\r
+ * memimgはFlashへ書き込むときに使用。\r
+ */\r
+ union{\r
+ /**\r
+ * 受信用構造体。host_name,param_buf[6]までのデータは、memimgのfast_boot以降のデータ構造と位置をあわせてください。\r
+ * param_buf[7]以降については値変換必須\r
+ * tmpにデータを作成後にmemimgへ整形して書きこむかんじ。\r
+ */\r
+ struct{\r
+ NyLPC_TUInt16 param_len;\r
+ NyLPC_TUInt16 host_len;\r
+ NyLPC_TChar host_name[NyLPC_TcNetConfig_HOSTNAME_LEN];\r
+ /**pパラメータ。最大長さは16。\r
+ * 詳細はNyLPC_TcModMiMicSetting_tを参照\r
+ */\r
+ NyLPC_TUInt32 param_buf[SIZE_OF_SETUP_PARAM];\r
+ NyLPC_TUInt32 cval;//コマンド値\r
+ }tmp;\r
+ /**\r
+ * 書き込み用構造体\r
*/\r
- NyLPC_TUInt32 param_buf[SIZE_OF_SETUP_PARAM];\r
- NyLPC_TChar host_name[NyLPC_TcNetConfig_HOSTNAME_LEN];\r
- NyLPC_TUInt16 param_len;\r
- NyLPC_TUInt16 host_len;\r
- NyLPC_TUInt32 cval;//コマンド値\r
+ struct NyLPC_TMiMicConfigulation memimg;\r
}setup;\r
struct{\r
/**\r
switch(out->_content_id)\r
{\r
case CONTENT_ID_SETUP:\r
- out->content.setup.param_len=0;//クエリが無い場合の初期値\r
- out->content.setup.host_len =0;//クエリが無い場合の初期値\r
- out->content.setup.cval=QVAL_C_UNKNOWN;\r
+ out->content.setup.tmp.param_len=0;//クエリが無い場合の初期値\r
+ out->content.setup.tmp.host_len =0;//クエリが無い場合の初期値\r
+ out->content.setup.tmp.cval=QVAL_C_UNKNOWN;\r
break;\r
default:\r
break;\r
switch(out->_qery_name_id){\r
case QNAME_ID_P:\r
out->_astate=ST_PARSE_QUERY_VALUE_P;//MIMICBCのDBパラメータパーサを借用。\r
- out->content.setup.param_len=0;\r
+ out->content.setup.tmp.param_len=0;\r
break;\r
case QNAME_ID_C:\r
out->_astate=ST_PARSE_QUERY_VALUE_C;\r
break;\r
case QNAME_ID_HOST:\r
out->_astate=ST_PARSE_QUERY_VALUE_HOST;//_host_nameに蓄積\r
- out->content.setup.host_len=0;\r
+ out->content.setup.tmp.host_len=0;\r
break;\r
default:\r
out->_astate=ST_PARSE_QUERY_VALUE;\r
if(!isalnum(i_c) && i_c!='_'){\r
NyLPC_OnErrorGoto(ERROR);\r
}\r
- out->content.setup.host_name[out->content.setup.host_len++]=i_c;\r
- if(out->content.setup.host_len>=NyLPC_TcNetConfig_HOSTNAME_LEN){\r
+ out->content.setup.tmp.host_name[out->content.setup.tmp.host_len++]=i_c;\r
+ if(out->content.setup.tmp.host_len>=NyLPC_TcNetConfig_HOSTNAME_LEN){\r
//長すぎ\r
NyLPC_OnErrorGoto(ERROR);\r
}\r
return NyLPC_TBool_TRUE;\r
}\r
//クエリ値解析完了\r
- out->content.setup.host_name[out->content.setup.host_len]='\0';\r
+ out->content.setup.tmp.host_name[out->content.setup.tmp.host_len]='\0';\r
out->_astate=ST_PARSE_QUERY_NAME;\r
return NyLPC_TBool_TRUE;\r
case ST_PARSE_QUERY_VALUE_C:\r
return NyLPC_TBool_TRUE;\r
}\r
if(NyLPC_cStr_isEqual(&out->_tstr,"get")){\r
- out->content.setup.cval=QVAL_C_GET;\r
+ out->content.setup.tmp.cval=QVAL_C_GET;\r
}else if(NyLPC_cStr_isEqual(&out->_tstr,"update")){\r
- out->content.setup.cval=QVAL_C_UPDATE;\r
+ out->content.setup.tmp.cval=QVAL_C_UPDATE;\r
}else{\r
NyLPC_OnErrorGoto(ERROR);\r
}\r
return NyLPC_TBool_TRUE;\r
case ST_PARSE_QUERY_VALUE_P:\r
if(i_c!='\0' && i_c!='&'){\r
- if(out->content.setup.param_len>=SIZE_OF_SETUP_PARAM)\r
+ if(out->content.setup.tmp.param_len>=SIZE_OF_SETUP_PARAM)\r
{\r
NyLPC_OnErrorGoto(ERROR);\r
}\r
- switch(NyLPC_cMiMicDbCompiler_compileFragment2(&(out->_binparser),i_c,out->content.setup.param_buf+out->content.setup.param_len))\r
+ switch(NyLPC_cMiMicDbCompiler_compileFragment2(&(out->_binparser),i_c,out->content.setup.tmp.param_buf+out->content.setup.tmp.param_len))\r
{\r
case NyLPC_TcMiMicDbCompiler_RET_CONTINUE:\r
break;\r
case NyLPC_TcMiMicDbCompiler_RET_OK:\r
- out->content.setup.param_len++;\r
+ out->content.setup.tmp.param_len++;\r
break;\r
case NyLPC_TcMiMicDbCompiler_RET_ERROR:\r
default:\r
{\r
NyLPC_TBool ret;\r
const struct NyLPC_TMiMicConfigulation* config;\r
- struct NyLPC_TMiMicConfigulation cfg_image;\r
const NyLPC_TcNetConfig_t* currebt_cfg;\r
NyLPC_Assert(\r
(NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET)||\r
(NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_HEAD));\r
\r
- switch(i_req->content.setup.cval){\r
+ switch(i_req->content.setup.tmp.cval){\r
case QVAL_C_GET:\r
if(!NyLPC_cHttpdUtils_sendJsonHeader(i_connection)){\r
NyLPC_OnErrorGoto(Error);\r
break;\r
case QVAL_C_UPDATE:\r
//check parameter length\r
- if(i_req->content.setup.param_len!=SIZE_OF_SETUP_PARAM || i_req->content.setup.host_len<1)\r
+ if(i_req->content.setup.tmp.param_len!=SIZE_OF_SETUP_PARAM || i_req->content.setup.tmp.host_len<1)\r
{\r
NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
}else{\r
//パラメータ→ROMイメージ変換\r
- cfg_image.fast_boot=0xffffffff;\r
- cfg_image.mac_00_01_02_03=(i_req->content.setup.param_buf[0]);\r
- cfg_image.mac_04_05_xx_xx=(i_req->content.setup.param_buf[1]&0xffff0000);\r
- cfg_image.ipv4_flags =i_req->content.setup.param_buf[2];\r
- cfg_image.ipv4_addr_net =i_req->content.setup.param_buf[3];\r
- cfg_image.ipv4_mask_net =i_req->content.setup.param_buf[4];\r
- cfg_image.ipv4_drut_net =i_req->content.setup.param_buf[5];\r
- cfg_image.srv_flags =i_req->content.setup.param_buf[6];\r
- cfg_image.http_port =(NyLPC_TUInt16)(i_req->content.setup.param_buf[7]>>16);\r
- strcpy(cfg_image.hostname,i_req->content.setup.host_name);\r
+ i_req->content.setup.memimg.fast_boot=0xffffffff;\r
+// ここの部分は受信時にデータ位置を合わせてあるのでコピー不要。\r
+// cfg_image.mac_00_01_02_03=(i_req->content.setup.param_buf[0]);\r
+// cfg_image.mac_04_05_xx_xx=(i_req->content.setup.param_buf[1]&0xffff0000);\r
+// cfg_image.ipv4_flags =i_req->content.setup.param_buf[2];\r
+// cfg_image.ipv4_addr_net =i_req->content.setup.param_buf[3];\r
+// cfg_image.ipv4_mask_net =i_req->content.setup.param_buf[4];\r
+// cfg_image.ipv4_drut_net =i_req->content.setup.param_buf[5];\r
+// cfg_image.srv_flags =i_req->content.setup.param_buf[6];\r
+// strcpy(cfg_image.hostname,i_req->content.setup.host_name);\r
+ i_req->content.setup.memimg.http_port =(NyLPC_TUInt16)(i_req->content.setup.tmp.param_buf[7]>>16);\r
+ i_req->content.setup.memimg.padding=0xffff;\r
//一応確認。\r
- if(cfg_image.http_port==0){\r
+ if(i_req->content.setup.memimg.http_port==0){\r
NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
}else{\r
//FreeRTOSの停止\r
NyLPC_cIsr_enterCritical();\r
//Flashへの書き込み\r
- ret=NyLPC_cMiMicConfiglation_updateConfigulation(&cfg_image);\r
+ ret=NyLPC_cMiMicConfiglation_updateConfigulation(&i_req->content.setup.memimg);\r
//FreeRTOSの復帰\r
NyLPC_cIsr_exitCritical();\r
if(!ret){\r
#include "NyLPC_cIPv4Payload_protected.h"\r
#include "NyLPC_cUipService_protected.h"\r
\r
+/**\r
+ * フラグ値\r
+ */\r
+#define NyLPC_cUdpSocket_FLAG_BROADCAST 0x01\r
+\r
#define lockResource(i_inst) NyLPC_cMutex_lock(((i_inst)->_smutex))\r
#define unlockResource(i_inst) NyLPC_cMutex_unlock(((i_inst)->_smutex))\r
\r
i_inst->_smutex=NyLPC_cIPv4_getSockMutex(&(srv->_tcpv4));\r
i_inst->uip_udp_conn.lport=NyLPC_htons(i_port);\r
i_inst->uip_udp_conn.mcastaddr=NyLPC_TIPv4Addr_ZERO;\r
+ i_inst->uip_udp_conn.flags=0x00;\r
i_inst->_handler=NULL;\r
\r
NyLPC_cFifoBuffer_initialize(&(i_inst->rxbuf),i_rbuf,i_rbuf_len);\r
{\r
i_inst->uip_udp_conn.mcastaddr=*i_addr;\r
}\r
+void NyLPC_cUdpSocket_setBroadcast(NyLPC_TcUdpSocket_t* i_inst)\r
+{\r
+ i_inst->uip_udp_conn.flags|=NyLPC_cUdpSocket_FLAG_BROADCAST;\r
+}\r
\r
\r
\r
NyLPC_TUInt16 tmp16;\r
struct NyLPC_TIPv4RxInfo dheader;\r
void* data_offset;\r
-\r
+ //ブロードキャストの場合、フラグを確認\r
+ if(NyLPC_TIPv4Addr_isEqual(&(o_ipp->header->destipaddr),&NyLPC_TIPv4Addr_BROADCAST)){\r
+ if(!NyLPC_TUInt8_isBitOn(i_inst->uip_udp_conn.flags,NyLPC_cUdpSocket_FLAG_BROADCAST)){\r
+ goto DROP;\r
+ }\r
+ }\r
//パラメータの計算\r
tmp16=NyLPC_TUdpHeader_getHeaderLength(o_ipp->payload.tcp);\r
//UDPペイロードの長さは、IPパケットの長さ-(IPヘッダ+UDPヘッダ)\r
{\r
void* buf;\r
NyLPC_TcIPv4Payload_t ipp;\r
+ //ブロードキャストの場合、フラグを確認\r
+ if(NyLPC_TIPv4Addr_isEqual(i_addr,&NyLPC_TIPv4Addr_BROADCAST)){\r
+ if(!NyLPC_TUInt8_isBitOn(i_inst->uip_udp_conn.flags,NyLPC_cUdpSocket_FLAG_BROADCAST)){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ }\r
\r
//先頭ポインタは、i_buf-sizeof(SIZE_OF_IPv4_TCPIP_HEADER)固定\r
buf=(NyLPC_TUInt8*)i_buf_ptr-SIZE_OF_IPv4_UDPIP_HEADER;\r