This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

libMiMic(MiMic library for mbed)は、WebService機能を提供するSDKです。 mbedでWebAPIに対応したネットワークデバイスを簡単に作ることが出来ます。

libMiMicはMiMic projectで開発しています。MiMic projectについてはこちらをご覧ください。 http://nyatla.jp/mimic/wp/

構成

libMiMicはmbedRTOS上で動作し、ユーザアプリケーションにAPIを提供します。コアAPIはC言語で記述されていますが、使用頻度の高いものについてはmbed向けのC++APIが準備されています。

/media/uploads/nyatla/libmimic-sdk.png

※libMiMicはmbedの標準イーサネットドライバをしようしていません。

標準イーサネットドライバと同時に使用することはできません。

  • MiMicIP - IPv4スタックです。レテンシとメモリ消費量を抑えたuipベースのライブラリです。
  • ARP/ICMP/UDP/TCP - 基礎的なソケットAPIを提供します。APIは独自です。
  • HTTP/1.1 Server - HTTP/1.1に対応したサーバです。マルチセッション・Chunked・持続性接続に対応しています。
  • HTTP Modules - HTTP/1.1の機能モジュールです。以下のモジュールがあります。
    • ROM file provider - ROMに格納したファイルイメージを公開します。
    • File system provider - mbedファイルシステムを公開します。
    • Onchip configuration - プログラムフラッシュを利用して設定を保存します。
    • MiMicVM processor - RPCリクエスト(MiMicVM)を処理します。
    • FileUpload - ファイルアップロードを受け取ります。
    • URL decoder - HTTPリクエストを解析します。
    • UPnP handler -UPnPメッセージを処理します。
    • WebSocket - Websocketサーバです。
  • mDNS - マルチキャストDNSサービスです。
  • UPnP - UPnP/1.0の機能を提供します。UPnP handlerと協調して動作します。(現在はデバイス探索(SSDP)・デスクリプション(Description)のみ実装してあります。)
  • DHCP/APIPA - ゼロコンフィギュレーション用のモジュールです。
  • HTTP/1.1 Client
  • mbed C++ class library - mbed向けのC++CPIです。C言語のものより簡単です。

対応機種

  • mbed(mbed LPC1768)
  • LPCXpresso1769

プログラム

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

サンプル

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

チュートリアル

English

libMiMic(MiMic library for mbed) is SDK which provides Webservice functions. It can be created networking device easily using mbed.

See more MiMic information, See MiMic project website. http://nyatla.jp/mimic/wp/

Structure

libMiMic run on mbed RTOS and provides networking API to user application. This library has C++ class API for the mbed, and low-level C language API.

/media/uploads/nyatla/libmimic-sdk.png

For WebService general, it can be written in a simple C + + API.

libMiMic does not have the standard Ethernet driver of mbed. It is not possible that will be used with the standard Ethernet driver.

  • MiMicIP - IPv4 protocol stack. This is based uip which is reduced memory and latency.
  • ARP / ICMP / UDP / TCP - Those are provide basic IP protocols.
  • HTTP/1.1 Server - The Http server compatible HTTP/1.1. It supports multi-session, chunked transport, persistent connection.
  • HTTP Modules - There are addon-module for HTTP server. The following modules.
    • ROM file module - Publish the file images in ROM.
    • File system module - Publish thefiles in mbed file system.
    • Onchip configuration module - To save the network settings to the program flash via REST.
    • MiMicVM module - To handle the (MiMicVM) RPC request.
    • FileUpload module - Accept a file via HTTP POST.
    • URL dedoce module - A versatility URL decoder.
    • UPnP handle module - To handle UPnP messages.
    • UPnP - This provides UPnP/1.0 device functions. It works together with UPnP handler.
    • Websocket - websocket (version13) server
  • mDNS Service - DNS-SD protocol server.
  • UPnP - This provides UPnP/1.0 device functions which works with UPnP handler. (You have been implemented (SSDP) ? description only (Description) device search now.) It is a module zero configuration for - DHCP / APIPA. mbed C + + class library - C of mbed for + + is the CPI. It is simple than that of the C language.
  • DHCP/APIPA - It support zero-cpnfigulation.
  • mbed C++ class library. Almost APIs for Web applications are available.
  • HTTP/1.1 Client

Supported target

  • mbed(mbed LPC1768)
  • LPCXpresso1769

Application

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

Sample

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

Tutorial

Committer:
nyatla
Date:
Sun Mar 15 09:33:38 2015 +0000
Revision:
110:257739f9b31e
Parent:
109:18f12ac01097
51d1c88c8a56d6295311cfd20aa197a9cd650b2d; ????; NetworkInterface???????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 37:fc4b4fd6a649 1 /*********************************************************************************
nyatla 37:fc4b4fd6a649 2 * PROJECT: MiMic
nyatla 37:fc4b4fd6a649 3 * --------------------------------------------------------------------------------
nyatla 37:fc4b4fd6a649 4 *
nyatla 37:fc4b4fd6a649 5 * This file is part of MiMic
nyatla 37:fc4b4fd6a649 6 * Copyright (C)2011 Ryo Iizuka
nyatla 37:fc4b4fd6a649 7 *
nyatla 37:fc4b4fd6a649 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 37:fc4b4fd6a649 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 37:fc4b4fd6a649 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 37:fc4b4fd6a649 11 * (at your option) any later version.
nyatla 37:fc4b4fd6a649 12 *
nyatla 37:fc4b4fd6a649 13 * This program is distributed in the hope that it will be useful,
nyatla 37:fc4b4fd6a649 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 37:fc4b4fd6a649 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 37:fc4b4fd6a649 16 * GNU General Public License for more details.
nyatla 37:fc4b4fd6a649 17 *
nyatla 37:fc4b4fd6a649 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 37:fc4b4fd6a649 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 37:fc4b4fd6a649 20 *
nyatla 37:fc4b4fd6a649 21 * For further information please contact.
nyatla 37:fc4b4fd6a649 22 * http://nyatla.jp/
nyatla 37:fc4b4fd6a649 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 37:fc4b4fd6a649 24 *
nyatla 37:fc4b4fd6a649 25 *********************************************************************************/
nyatla 37:fc4b4fd6a649 26 #include "NyLPC_cMDnsServer.h"
nyatla 109:18f12ac01097 27 #include "NyLPC_netif.h"
nyatla 37:fc4b4fd6a649 28 #include "NyLPC_http.h"
nyatla 37:fc4b4fd6a649 29 #include "NyLPC_utils.h"
nyatla 37:fc4b4fd6a649 30 #include <stdio.h>
nyatla 37:fc4b4fd6a649 31 #include <string.h>
nyatla 37:fc4b4fd6a649 32
nyatla 37:fc4b4fd6a649 33
nyatla 37:fc4b4fd6a649 34 /**
nyatla 37:fc4b4fd6a649 35 * mDNSのポート番号
nyatla 37:fc4b4fd6a649 36 */
nyatla 37:fc4b4fd6a649 37 #define MDNS_MCAST_PORT 5353
nyatla 103:853ddf4a1b81 38 static const struct NyLPC_TIPv4Addr MDNS_MCAST_IPADDR = NyLPC_TIPv4Addr_pack(224, 0, 0, 251);
nyatla 37:fc4b4fd6a649 39 #define TIMEOUT_IN_MS 1000
nyatla 104:4f4781ecdc79 40 #define NyLPC_TcMDns_RES_TTL (120) //120
nyatla 104:4f4781ecdc79 41 #define NyLPC_TcMDns_STD_TTL (30*60) //(30min
nyatla 37:fc4b4fd6a649 42
nyatla 37:fc4b4fd6a649 43
nyatla 37:fc4b4fd6a649 44 struct NyLPC_TDnsHeader
nyatla 37:fc4b4fd6a649 45 {
nyatla 37:fc4b4fd6a649 46 NyLPC_TUInt16 id;
nyatla 37:fc4b4fd6a649 47 NyLPC_TUInt16 flag;
nyatla 37:fc4b4fd6a649 48 NyLPC_TUInt16 qd;
nyatla 37:fc4b4fd6a649 49 NyLPC_TUInt16 an;
nyatla 37:fc4b4fd6a649 50 NyLPC_TUInt16 ns;
nyatla 37:fc4b4fd6a649 51 NyLPC_TUInt16 ar;
nyatla 37:fc4b4fd6a649 52 }PACK_STRUCT_END;
nyatla 37:fc4b4fd6a649 53
nyatla 37:fc4b4fd6a649 54 #define NyLPC_TDnsHeader_FLAG_MASK_QR 0x8000
nyatla 37:fc4b4fd6a649 55 #define NyLPC_TDnsHeader_FLAG_MASK_OPCODE 0x7800
nyatla 37:fc4b4fd6a649 56 #define NyLPC_TDnsHeader_FLAG_MASK_AA 0x0400
nyatla 37:fc4b4fd6a649 57 #define NyLPC_TDnsHeader_FLAG_MASK_TC 0x0200
nyatla 37:fc4b4fd6a649 58 #define NyLPC_TDnsHeader_FLAG_MASK_RD 0x0100
nyatla 37:fc4b4fd6a649 59 #define NyLPC_TDnsHeader_FLAG_MASK_RA 0x0080
nyatla 37:fc4b4fd6a649 60 #define NyLPC_TDnsHeader_FLAG_MASK_Z 0x0070
nyatla 37:fc4b4fd6a649 61 #define NyLPC_TDnsHeader_FLAG_MASK_RECODE 0x000F
nyatla 37:fc4b4fd6a649 62
nyatla 37:fc4b4fd6a649 63 struct NyLPC_TDnsQuestion
nyatla 37:fc4b4fd6a649 64 {
nyatla 98:6284ce9a0476 65 const char* buf; //Questionパケットの先頭
nyatla 98:6284ce9a0476 66 NyLPC_TUInt16 buf_len; //パケット長さ
nyatla 37:fc4b4fd6a649 67 NyLPC_TUInt16 qtype;
nyatla 37:fc4b4fd6a649 68 NyLPC_TUInt16 qclass;
nyatla 98:6284ce9a0476 69 NyLPC_TInt16 qname_pos;//Qnameの開始位置
nyatla 37:fc4b4fd6a649 70 };
nyatla 98:6284ce9a0476 71
nyatla 37:fc4b4fd6a649 72 #define NyLPC_TDnsQuestion_QTYPR_A 1
nyatla 37:fc4b4fd6a649 73 #define NyLPC_TDnsQuestion_QTYPR_NS 2
nyatla 37:fc4b4fd6a649 74 #define NyLPC_TDnsQuestion_QTYPR_CNAME 5
nyatla 37:fc4b4fd6a649 75 #define NyLPC_TDnsQuestion_QTYPR_SOA 6
nyatla 37:fc4b4fd6a649 76 #define NyLPC_TDnsQuestion_QTYPR_PTR 12
nyatla 37:fc4b4fd6a649 77 #define NyLPC_TDnsQuestion_QTYPR_MX 15
nyatla 37:fc4b4fd6a649 78 #define NyLPC_TDnsQuestion_QTYPR_TXT 16
nyatla 37:fc4b4fd6a649 79 #define NyLPC_TDnsQuestion_QTYPR_ANY 255
nyatla 102:41a5e92e0a8e 80 #define NyLPC_TDnsQuestion_QTYPR_AAAA 28
nyatla 102:41a5e92e0a8e 81 #define NyLPC_TDnsQuestion_QTYPR_NSEC 47
nyatla 37:fc4b4fd6a649 82 #define NyLPC_TDnsQuestion_QCLASS_IN 1
nyatla 37:fc4b4fd6a649 83 #define NyLPC_TDnsQuestion_QCLASS_CH 3
nyatla 37:fc4b4fd6a649 84 #define NyLPC_TDnsQuestion_QCLASS_HS 4
nyatla 37:fc4b4fd6a649 85 #define NyLPC_TDnsQuestion_QTYPR_SRV 33
nyatla 101:5022828ace54 86 #define NyLPC_TDnsQuestion_QCLASS_CACHE_FLUSH 0x8000
nyatla 101:5022828ace54 87
nyatla 37:fc4b4fd6a649 88
nyatla 37:fc4b4fd6a649 89 /**************************************************
nyatla 103:853ddf4a1b81 90 * TLabelCache
nyatla 103:853ddf4a1b81 91 **************************************************/
nyatla 98:6284ce9a0476 92 /**
nyatla 98:6284ce9a0476 93 * nameフィールドの文字列圧縮を解除して圧縮後のテキストポインタを返します。
nyatla 98:6284ce9a0476 94 */
nyatla 98:6284ce9a0476 95 static const char* getExtractNamePos(const char* i_packet_buf, const char* i_spos)
nyatla 37:fc4b4fd6a649 96 {
nyatla 103:853ddf4a1b81 97 NyLPC_TUInt8 limit = 0;
nyatla 98:6284ce9a0476 98 const char* s = i_spos;// question->buf + pos;//クエリの解析位置
nyatla 98:6284ce9a0476 99 for (;;){
nyatla 98:6284ce9a0476 100 switch (*(const NyLPC_TUInt8*)s){
nyatla 98:6284ce9a0476 101 case 0x00:
nyatla 98:6284ce9a0476 102 //queryが先に終了に到達するのはおかしい。
nyatla 98:6284ce9a0476 103 return NULL;
nyatla 98:6284ce9a0476 104 case 0xc0:
nyatla 98:6284ce9a0476 105 s = i_packet_buf + *((const NyLPC_TUInt8*)s + 1);//参照先にジャンプ
nyatla 103:853ddf4a1b81 106 if (i_spos <= s){
nyatla 98:6284ce9a0476 107 //後方参照ならエラー
nyatla 98:6284ce9a0476 108 return NULL;
nyatla 98:6284ce9a0476 109 }
nyatla 98:6284ce9a0476 110 limit++;
nyatla 98:6284ce9a0476 111 if (limit > 32){
nyatla 98:6284ce9a0476 112 return NULL;
nyatla 98:6284ce9a0476 113 }
nyatla 98:6284ce9a0476 114 continue;
nyatla 98:6284ce9a0476 115 default:
nyatla 98:6284ce9a0476 116 break;
nyatla 98:6284ce9a0476 117 }
nyatla 98:6284ce9a0476 118 break;
nyatla 98:6284ce9a0476 119 }
nyatla 98:6284ce9a0476 120 return s;
nyatla 98:6284ce9a0476 121 }
nyatla 98:6284ce9a0476 122
nyatla 98:6284ce9a0476 123 /**
nyatla 103:853ddf4a1b81 124 * 展開しない圧縮文字列の長さを返す
nyatla 103:853ddf4a1b81 125 */
nyatla 101:5022828ace54 126 static NyLPC_TInt16 sizeofCompressName(const char* i_str)
nyatla 37:fc4b4fd6a649 127 {
nyatla 98:6284ce9a0476 128 NyLPC_TInt16 l = 0;
nyatla 98:6284ce9a0476 129 NyLPC_TUInt8 c;
nyatla 98:6284ce9a0476 130 for (;;){
nyatla 98:6284ce9a0476 131 c = (NyLPC_TUInt8)*(i_str + l);
nyatla 98:6284ce9a0476 132 switch (c){
nyatla 98:6284ce9a0476 133 case 0xc0:
nyatla 98:6284ce9a0476 134 return l + 2;
nyatla 98:6284ce9a0476 135 case 0x00:
nyatla 98:6284ce9a0476 136 return l + 1;
nyatla 98:6284ce9a0476 137 }
nyatla 98:6284ce9a0476 138 l += c + 1;
nyatla 98:6284ce9a0476 139 }
nyatla 37:fc4b4fd6a649 140 }
nyatla 98:6284ce9a0476 141 /**
nyatla 103:853ddf4a1b81 142 * @return
nyatla 103:853ddf4a1b81 143 * 圧縮するとtrue i_nameは2文字に圧縮される。
nyatla 103:853ddf4a1b81 144 */
nyatla 98:6284ce9a0476 145 static NyLPC_TBool compressNameB(char* i_packet, NyLPC_TUInt16 i_spos, NyLPC_TUInt16 i_name_pos)
nyatla 37:fc4b4fd6a649 146 {
nyatla 98:6284ce9a0476 147 NyLPC_TUInt16 ret;
nyatla 98:6284ce9a0476 148 const char* p; //プロトコル文字列の解析開始位置
nyatla 98:6284ce9a0476 149 const char* s = i_packet + i_spos; //クエリの解析位置
nyatla 98:6284ce9a0476 150 const char* s2;
nyatla 98:6284ce9a0476 151
nyatla 98:6284ce9a0476 152 //Protocol
nyatla 98:6284ce9a0476 153 for (;;){
nyatla 98:6284ce9a0476 154 //0xc0参照の解決
nyatla 98:6284ce9a0476 155 s = getExtractNamePos(i_packet, s);
nyatla 98:6284ce9a0476 156 if (s == NULL){
nyatla 98:6284ce9a0476 157 //一致しない
nyatla 98:6284ce9a0476 158 return 0;
nyatla 98:6284ce9a0476 159 }
nyatla 98:6284ce9a0476 160 for (;;){
nyatla 98:6284ce9a0476 161 //検索位置のドメインを遡る
nyatla 103:853ddf4a1b81 162 if (*s == *(i_packet + i_name_pos)){
nyatla 98:6284ce9a0476 163 //先頭一致
nyatla 98:6284ce9a0476 164 p = i_packet + i_name_pos;
nyatla 98:6284ce9a0476 165 s2 = getExtractNamePos(i_packet, s);
nyatla 98:6284ce9a0476 166 ret = (NyLPC_TUInt16)(s2 - i_packet);
nyatla 98:6284ce9a0476 167 for (;;){
nyatla 98:6284ce9a0476 168 //一致判定
nyatla 98:6284ce9a0476 169 if (s2 == NULL){
nyatla 98:6284ce9a0476 170 break;
nyatla 98:6284ce9a0476 171 }
nyatla 98:6284ce9a0476 172
nyatla 98:6284ce9a0476 173 if (memcmp(p, s2, (*(NyLPC_TUInt8*)s2 + 1)) != 0){
nyatla 98:6284ce9a0476 174 //不一致
nyatla 98:6284ce9a0476 175 break;
nyatla 98:6284ce9a0476 176 }
nyatla 98:6284ce9a0476 177 //検出位置の移動
nyatla 98:6284ce9a0476 178 p += (*(NyLPC_TUInt8*)s2) + 1;
nyatla 98:6284ce9a0476 179 s2 += (*(NyLPC_TUInt8*)s2) + 1;
nyatla 98:6284ce9a0476 180 if (*p == 0 && *s2 == 0){
nyatla 98:6284ce9a0476 181 //charで扱ってるクライアントのコケ防止
nyatla 103:853ddf4a1b81 182 if (ret>0xff){
nyatla 98:6284ce9a0476 183 return 0;
nyatla 98:6284ce9a0476 184 }
nyatla 98:6284ce9a0476 185 *(i_packet + i_name_pos + 0) = 0xc0;
nyatla 98:6284ce9a0476 186 *(i_packet + i_name_pos + 1) = (NyLPC_TUInt8)ret;
nyatla 98:6284ce9a0476 187 return ret;
nyatla 98:6284ce9a0476 188 }
nyatla 98:6284ce9a0476 189 s2 = getExtractNamePos(i_packet, s2);
nyatla 37:fc4b4fd6a649 190 }
nyatla 98:6284ce9a0476 191 }
nyatla 98:6284ce9a0476 192 //一致しない->検索パターンの次のフラグメントを調べる
nyatla 98:6284ce9a0476 193 s += (*(NyLPC_TUInt8*)s) + 1;
nyatla 98:6284ce9a0476 194 break;
nyatla 98:6284ce9a0476 195 }
nyatla 37:fc4b4fd6a649 196 }
nyatla 98:6284ce9a0476 197 }
nyatla 98:6284ce9a0476 198 /**
nyatla 103:853ddf4a1b81 199 * mDNSパケットからi_nameを検索する。
nyatla 103:853ddf4a1b81 200 * i_targetはi_packetに含まれ、NULL終端されていること
nyatla 103:853ddf4a1b81 201 * @return 0 圧縮失敗/その他:圧縮後のパケットサイズ
nyatla 103:853ddf4a1b81 202 *
nyatla 103:853ddf4a1b81 203 */
nyatla 103:853ddf4a1b81 204 static NyLPC_TUInt16 compressNameA(char* i_packet, NyLPC_TUInt16 i_name_start, NyLPC_TUInt16 i_name_pos)
nyatla 98:6284ce9a0476 205 {
nyatla 98:6284ce9a0476 206 NyLPC_TUInt16 s = 12;
nyatla 98:6284ce9a0476 207 for (;;){
nyatla 98:6284ce9a0476 208 if (i_name_start <= s){
nyatla 98:6284ce9a0476 209 //圧縮対象文字列に到達
nyatla 98:6284ce9a0476 210 return 0;
nyatla 98:6284ce9a0476 211 }
nyatla 98:6284ce9a0476 212 //i_targetとAnswer文字列が等しいか確認
nyatla 98:6284ce9a0476 213 if (compressNameB(i_packet, s, i_name_pos)){
nyatla 98:6284ce9a0476 214 return i_name_pos + 2;
nyatla 98:6284ce9a0476 215 }
nyatla 98:6284ce9a0476 216 //
nyatla 103:853ddf4a1b81 217 s += sizeofCompressName(i_packet + s);
nyatla 103:853ddf4a1b81 218 s += 2 + 2 + 4 + 2;
nyatla 103:853ddf4a1b81 219 if (i_name_start <= s){
nyatla 103:853ddf4a1b81 220 //圧縮対象文字列に到達
nyatla 103:853ddf4a1b81 221 return 0;
nyatla 98:6284ce9a0476 222 }
nyatla 103:853ddf4a1b81 223 // //データは圧縮ポインタにしない方がいいらしい。
nyatla 103:853ddf4a1b81 224 // if (compressNameB(i_packet, s, i_name_pos)){
nyatla 103:853ddf4a1b81 225 // return i_name_pos + 2;
nyatla 103:853ddf4a1b81 226 // }
nyatla 103:853ddf4a1b81 227 s += NyLPC_ntohs(*((NyLPC_TUInt16*)(i_packet + s - 2)));
nyatla 98:6284ce9a0476 228 }
nyatla 98:6284ce9a0476 229 }
nyatla 98:6284ce9a0476 230 /**
nyatla 103:853ddf4a1b81 231 * @return
nyatla 103:853ddf4a1b81 232 * 新しいi_packetの長さ
nyatla 103:853ddf4a1b81 233 */
nyatla 98:6284ce9a0476 234 static NyLPC_TUInt16 compressName(char* i_packet, NyLPC_TUInt16 i_name_pos, NyLPC_TUInt16 i_name_len)
nyatla 98:6284ce9a0476 235 {
nyatla 98:6284ce9a0476 236 NyLPC_TUInt16 p;
nyatla 98:6284ce9a0476 237 NyLPC_TUInt16 s = i_name_pos;
nyatla 98:6284ce9a0476 238 for (;;){
nyatla 103:853ddf4a1b81 239 p = compressNameA(i_packet, i_name_pos, s);
nyatla 98:6284ce9a0476 240 //i_targetとAnswer文字列が等しいか確認
nyatla 98:6284ce9a0476 241 if (p != 0){
nyatla 98:6284ce9a0476 242 return p;
nyatla 98:6284ce9a0476 243 }
nyatla 98:6284ce9a0476 244 s += (NyLPC_TUInt16)*(i_packet + s) + 1;
nyatla 103:853ddf4a1b81 245 if (*(i_packet + s) == 0){
nyatla 98:6284ce9a0476 246 //圧縮対象文字列に到達
nyatla 98:6284ce9a0476 247 return (i_name_len + i_name_pos);
nyatla 98:6284ce9a0476 248 }
nyatla 98:6284ce9a0476 249 }
nyatla 37:fc4b4fd6a649 250 }
nyatla 37:fc4b4fd6a649 251
nyatla 37:fc4b4fd6a649 252
nyatla 37:fc4b4fd6a649 253
nyatla 37:fc4b4fd6a649 254
nyatla 37:fc4b4fd6a649 255
nyatla 37:fc4b4fd6a649 256 /**
nyatla 37:fc4b4fd6a649 257 * 受領可能なQuestionか確認する
nyatla 37:fc4b4fd6a649 258 * @return
nyatla 37:fc4b4fd6a649 259 * 受領可能なQuestionの数
nyatla 37:fc4b4fd6a649 260 *
nyatla 37:fc4b4fd6a649 261 */
nyatla 98:6284ce9a0476 262 static NyLPC_TUInt16 getNumberOfQuestion(const void* i_packet, NyLPC_TUInt16 i_len)
nyatla 37:fc4b4fd6a649 263 {
nyatla 98:6284ce9a0476 264 struct NyLPC_TDnsHeader* ptr = (struct NyLPC_TDnsHeader*)i_packet;
nyatla 37:fc4b4fd6a649 265 NyLPC_TUInt16 t;
nyatla 98:6284ce9a0476 266 if (i_len<sizeof(struct NyLPC_TDnsHeader)){
nyatla 37:fc4b4fd6a649 267 return NyLPC_TBool_FALSE;
nyatla 37:fc4b4fd6a649 268 }
nyatla 37:fc4b4fd6a649 269 //questrionの確認
nyatla 37:fc4b4fd6a649 270 //QR==0 && op==0 && tc=0
nyatla 98:6284ce9a0476 271 t = NyLPC_ntohs(ptr->flag);
nyatla 98:6284ce9a0476 272 if (((t & NyLPC_TDnsHeader_FLAG_MASK_QR) != 0) &&
nyatla 98:6284ce9a0476 273 ((t & NyLPC_TDnsHeader_FLAG_MASK_OPCODE) != 0) &&
nyatla 98:6284ce9a0476 274 ((t & NyLPC_TDnsHeader_FLAG_MASK_TC) != 0))
nyatla 37:fc4b4fd6a649 275 {
nyatla 37:fc4b4fd6a649 276 //this is response
nyatla 37:fc4b4fd6a649 277 return 0;
nyatla 37:fc4b4fd6a649 278 }
nyatla 37:fc4b4fd6a649 279 return NyLPC_ntohs(ptr->qd);
nyatla 37:fc4b4fd6a649 280 }
nyatla 37:fc4b4fd6a649 281
nyatla 98:6284ce9a0476 282 /**
nyatla 98:6284ce9a0476 283 * [i_name].[i_protocol].localをquestionと比較します。i_nameは省略ができます。
nyatla 101:5022828ace54 284 * i_nameはincasesensitiveです。
nyatla 98:6284ce9a0476 285 * @return 等しい場合true
nyatla 98:6284ce9a0476 286 */
nyatla 98:6284ce9a0476 287 static NyLPC_TBool NyLPC_TDnsQuestion_isEqualName(const struct NyLPC_TDnsQuestion* question, const char* i_name, const char* i_protocol)
nyatla 37:fc4b4fd6a649 288 {
nyatla 98:6284ce9a0476 289 NyLPC_TUInt8 tmp;
nyatla 98:6284ce9a0476 290 const char* p; //プロトコル文字列の解析開始位置
nyatla 98:6284ce9a0476 291 const char* s = question->buf + (NyLPC_TUInt8)question->qname_pos; //クエリの解析位置
nyatla 98:6284ce9a0476 292
nyatla 98:6284ce9a0476 293 //Domain
nyatla 98:6284ce9a0476 294 if (i_name != NULL){
nyatla 98:6284ce9a0476 295 //0xc0参照の解決
nyatla 98:6284ce9a0476 296 s = getExtractNamePos(question->buf, s);
nyatla 98:6284ce9a0476 297 if (s == NULL){
nyatla 98:6284ce9a0476 298 return NyLPC_TBool_FALSE;
nyatla 98:6284ce9a0476 299 }
nyatla 98:6284ce9a0476 300 tmp = (NyLPC_TUInt8)strlen(i_name);
nyatla 101:5022828ace54 301 if (tmp != *s || NyLPC_strnicmp(s + 1, i_name, tmp) != 0){
nyatla 98:6284ce9a0476 302 return NyLPC_TBool_FALSE;
nyatla 98:6284ce9a0476 303 }
nyatla 98:6284ce9a0476 304 s += (*s) + 1;
nyatla 103:853ddf4a1b81 305 }
nyatla 103:853ddf4a1b81 306 else{
nyatla 98:6284ce9a0476 307 s = question->buf + (NyLPC_TUInt8)question->qname_pos;//クエリの解析位置
nyatla 98:6284ce9a0476 308 }
nyatla 98:6284ce9a0476 309 p = i_protocol;
nyatla 98:6284ce9a0476 310 //Protocol
nyatla 98:6284ce9a0476 311 for (;;){
nyatla 98:6284ce9a0476 312 //0xc0参照の解決
nyatla 98:6284ce9a0476 313 s = getExtractNamePos(question->buf, s);
nyatla 98:6284ce9a0476 314 if (s == NULL){
nyatla 98:6284ce9a0476 315 return NyLPC_TBool_FALSE;
nyatla 98:6284ce9a0476 316 }
nyatla 98:6284ce9a0476 317 //SRVの末端到達
nyatla 98:6284ce9a0476 318 if (*p == 0){
nyatla 98:6284ce9a0476 319 if (question->buf + question->buf_len<s + 7 + 4){
nyatla 98:6284ce9a0476 320 return NyLPC_TBool_FALSE;
nyatla 98:6284ce9a0476 321 }
nyatla 98:6284ce9a0476 322 return (memcmp("\5local\0", s, 7) == 0);
nyatla 98:6284ce9a0476 323 }
nyatla 98:6284ce9a0476 324 //有効サイズなら一致検出
nyatla 98:6284ce9a0476 325 if (question->buf + question->buf_len<s + 1 + (NyLPC_TUInt8)*s + 4){
nyatla 98:6284ce9a0476 326 return NyLPC_TBool_FALSE;
nyatla 98:6284ce9a0476 327 }
nyatla 98:6284ce9a0476 328 if (memcmp(p, s + 1, (NyLPC_TUInt8)*s) != 0){
nyatla 98:6284ce9a0476 329 //不一致
nyatla 98:6284ce9a0476 330 return NyLPC_TBool_FALSE;
nyatla 98:6284ce9a0476 331 }
nyatla 98:6284ce9a0476 332 //検出位置の移動
nyatla 98:6284ce9a0476 333 p += (*s) + 1;
nyatla 98:6284ce9a0476 334 s += (*s) + 1;
nyatla 98:6284ce9a0476 335 }
nyatla 98:6284ce9a0476 336 }
nyatla 98:6284ce9a0476 337
nyatla 98:6284ce9a0476 338
nyatla 98:6284ce9a0476 339 static NyLPC_TUInt16 NyLPC_TDnsQuestion_parse(const char* i_packet, NyLPC_TUInt16 i_packet_len, NyLPC_TInt16 i_parse_start, struct NyLPC_TDnsQuestion* o_val)
nyatla 98:6284ce9a0476 340 {
nyatla 37:fc4b4fd6a649 341 NyLPC_TUInt16 i;
nyatla 98:6284ce9a0476 342 //解析開始位置を計算
nyatla 98:6284ce9a0476 343 NyLPC_TUInt16 qlen = 0;
nyatla 98:6284ce9a0476 344 for (i = i_parse_start; i<i_packet_len - 4; i++){
nyatla 98:6284ce9a0476 345 switch ((NyLPC_TUInt8)(*(i_packet + i))){
nyatla 98:6284ce9a0476 346 case 0x00:
nyatla 98:6284ce9a0476 347 qlen++;
nyatla 98:6284ce9a0476 348 break;
nyatla 98:6284ce9a0476 349 case 0xc0:
nyatla 103:853ddf4a1b81 350 qlen += 2;
nyatla 98:6284ce9a0476 351 break;
nyatla 98:6284ce9a0476 352 default:
nyatla 98:6284ce9a0476 353 qlen++;
nyatla 98:6284ce9a0476 354 continue;
nyatla 37:fc4b4fd6a649 355 }
nyatla 98:6284ce9a0476 356 o_val->buf = i_packet;
nyatla 98:6284ce9a0476 357 o_val->buf_len = i_packet_len;
nyatla 98:6284ce9a0476 358 o_val->qname_pos = i_parse_start;
nyatla 103:853ddf4a1b81 359 o_val->qtype = NyLPC_ntohs(*(NyLPC_TUInt16*)(i_packet + i_parse_start + qlen));
nyatla 103:853ddf4a1b81 360 o_val->qclass = NyLPC_ntohs(*(NyLPC_TUInt16*)(i_packet + i_parse_start + qlen + sizeof(NyLPC_TUInt16)));
nyatla 98:6284ce9a0476 361 return qlen + 4;
nyatla 37:fc4b4fd6a649 362 }
nyatla 37:fc4b4fd6a649 363 return 0;
nyatla 37:fc4b4fd6a649 364 }
nyatla 37:fc4b4fd6a649 365
nyatla 37:fc4b4fd6a649 366 /**
nyatla 37:fc4b4fd6a649 367 * DNSレコードのPRTフィールドとDNSラベル文字列を比較する。
nyatla 37:fc4b4fd6a649 368 */
nyatla 103:853ddf4a1b81 369 static NyLPC_TInt16 NyLPC_TDnsRecord_getMatchPtrIdx(const struct NyLPC_TDnsRecord* i_struct, const struct NyLPC_TDnsQuestion* question)
nyatla 37:fc4b4fd6a649 370 {
nyatla 37:fc4b4fd6a649 371 NyLPC_TInt16 i;
nyatla 103:853ddf4a1b81 372 for (i = 0; i<i_struct->num_of_srv; i++){
nyatla 103:853ddf4a1b81 373 if (NyLPC_TDnsQuestion_isEqualName(question, NULL, i_struct->srv[i].protocol)){
nyatla 37:fc4b4fd6a649 374 return i;
nyatla 37:fc4b4fd6a649 375 }
nyatla 37:fc4b4fd6a649 376 }
nyatla 37:fc4b4fd6a649 377 return -1;
nyatla 37:fc4b4fd6a649 378 }
nyatla 103:853ddf4a1b81 379 static NyLPC_TInt16 NyLPC_TDnsRecord_getMatchSrvIdx(const struct NyLPC_TDnsRecord* i_struct, const struct NyLPC_TDnsQuestion* question)
nyatla 37:fc4b4fd6a649 380 {
nyatla 37:fc4b4fd6a649 381 NyLPC_TInt16 i;
nyatla 103:853ddf4a1b81 382 for (i = 0; i<i_struct->num_of_srv; i++){
nyatla 103:853ddf4a1b81 383 if (NyLPC_TDnsQuestion_isEqualName(question, i_struct->name, i_struct->srv[i].protocol)){
nyatla 37:fc4b4fd6a649 384 return i;
nyatla 37:fc4b4fd6a649 385 }
nyatla 37:fc4b4fd6a649 386 }
nyatla 37:fc4b4fd6a649 387 return -1;
nyatla 37:fc4b4fd6a649 388 }
nyatla 98:6284ce9a0476 389
nyatla 37:fc4b4fd6a649 390
nyatla 37:fc4b4fd6a649 391
nyatla 37:fc4b4fd6a649 392 /**
nyatla 37:fc4b4fd6a649 393 * '.'区切り文字列をDNS形式の[n]text[n]text\0へ変換する。
nyatla 37:fc4b4fd6a649 394 * @return
nyatla 37:fc4b4fd6a649 395 * 変換後のデータブロックの長さin byte
nyatla 37:fc4b4fd6a649 396 * 終端の\0の長さを含みます。
nyatla 37:fc4b4fd6a649 397 */
nyatla 103:853ddf4a1b81 398 static NyLPC_TInt16 str2label(NyLPC_TChar* buf, const NyLPC_TChar* name)
nyatla 37:fc4b4fd6a649 399 {
nyatla 37:fc4b4fd6a649 400 //proto文字列の変換
nyatla 37:fc4b4fd6a649 401 NyLPC_TChar* lp;
nyatla 103:853ddf4a1b81 402 const NyLPC_TChar* n = name;
nyatla 103:853ddf4a1b81 403 NyLPC_TChar* b = buf;
nyatla 103:853ddf4a1b81 404 while (*n != '\0'){
nyatla 103:853ddf4a1b81 405 lp = b;
nyatla 37:fc4b4fd6a649 406 b++;
nyatla 103:853ddf4a1b81 407 for (; strchr(".\0", *n) == NULL;){
nyatla 103:853ddf4a1b81 408 *b = *n;
nyatla 37:fc4b4fd6a649 409 b++;
nyatla 37:fc4b4fd6a649 410 n++;
nyatla 37:fc4b4fd6a649 411 }
nyatla 103:853ddf4a1b81 412 *lp = (char)(b - lp - 1);
nyatla 103:853ddf4a1b81 413 if (*n != '\0'){
nyatla 37:fc4b4fd6a649 414 n++;
nyatla 37:fc4b4fd6a649 415 }
nyatla 37:fc4b4fd6a649 416 }
nyatla 103:853ddf4a1b81 417 *b = '\0';
nyatla 37:fc4b4fd6a649 418 b++;
nyatla 103:853ddf4a1b81 419 return (NyLPC_TInt16)((int)b - (int)buf);
nyatla 37:fc4b4fd6a649 420 }
nyatla 37:fc4b4fd6a649 421 /**
nyatla 102:41a5e92e0a8e 422 * query文字列をパケットに追記します。
nyatla 102:41a5e92e0a8e 423 * @return 出力したバイト数
nyatla 102:41a5e92e0a8e 424 */
nyatla 103:853ddf4a1b81 425 static NyLPC_TInt16 query2label(char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen, const struct NyLPC_TDnsQuestion* i_query)
nyatla 37:fc4b4fd6a649 426 {
nyatla 102:41a5e92e0a8e 427 const char* n;
nyatla 103:853ddf4a1b81 428 NyLPC_TInt16 s = i_query->qname_pos;
nyatla 103:853ddf4a1b81 429 NyLPC_TInt16 l = 0;//出力した文字数
nyatla 103:853ddf4a1b81 430 for (;;){
nyatla 103:853ddf4a1b81 431 n = getExtractNamePos(i_query->buf, i_query->buf + s);
nyatla 103:853ddf4a1b81 432 if (n == NULL){
nyatla 103:853ddf4a1b81 433 *(i_packet + i_spos + l) = 0;
nyatla 103:853ddf4a1b81 434 l++;
nyatla 102:41a5e92e0a8e 435 break;
nyatla 103:853ddf4a1b81 436 }
nyatla 103:853ddf4a1b81 437 else{
nyatla 103:853ddf4a1b81 438 memcpy(i_packet + i_spos + l, n, ((NyLPC_TUInt8)*n) + 1);
nyatla 103:853ddf4a1b81 439 l += ((NyLPC_TUInt8)*n) + 1;
nyatla 103:853ddf4a1b81 440 s = (NyLPC_TInt16)((int)n - (int)i_query->buf + ((NyLPC_TUInt8)*n) + 1);
nyatla 103:853ddf4a1b81 441 if (obuflen<i_spos + l + 1){
nyatla 102:41a5e92e0a8e 442 return 0;
nyatla 102:41a5e92e0a8e 443 }
nyatla 102:41a5e92e0a8e 444 }
nyatla 37:fc4b4fd6a649 445 }
nyatla 103:853ddf4a1b81 446 return l;
nyatla 102:41a5e92e0a8e 447 }
nyatla 102:41a5e92e0a8e 448
nyatla 37:fc4b4fd6a649 449
nyatla 104:4f4781ecdc79 450 static NyLPC_TInt16 writeSrvResourceHeader(char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 buflen, const struct NyLPC_TDnsRecord* i_recode, NyLPC_TInt16 i_sid, NyLPC_TUInt16 i_type, NyLPC_TUInt16 i_class,NyLPC_TUInt16 i_ttl)
nyatla 37:fc4b4fd6a649 451 {
nyatla 98:6284ce9a0476 452 NyLPC_TInt16 s;
nyatla 103:853ddf4a1b81 453 NyLPC_TInt16 l = (NyLPC_TInt16)(1 + strlen(i_recode->name) + 1 + strlen(i_recode->srv[i_sid].protocol) + 1 + 5 + 1);
nyatla 103:853ddf4a1b81 454 if (buflen<i_spos + l + 2 + 2 + 4){
nyatla 37:fc4b4fd6a649 455 return 0;
nyatla 37:fc4b4fd6a649 456 }
nyatla 103:853ddf4a1b81 457 s = str2label(i_packet + i_spos, i_recode->name) - 1;
nyatla 103:853ddf4a1b81 458 s += str2label(i_packet + i_spos + s, i_recode->srv[i_sid].protocol) - 1;
nyatla 103:853ddf4a1b81 459 s += str2label(i_packet + i_spos + s, "local");
nyatla 103:853ddf4a1b81 460 l = compressName(i_packet, i_spos, s);//圧縮
nyatla 103:853ddf4a1b81 461 (*(NyLPC_TUInt16*)(i_packet + l)) = NyLPC_HTONS(i_type);
nyatla 103:853ddf4a1b81 462 (*(NyLPC_TUInt16*)(i_packet + l + 2)) = NyLPC_HTONS(i_class);
nyatla 104:4f4781ecdc79 463 (*(NyLPC_TUInt32*)(i_packet + l + 4)) = NyLPC_HTONL(i_ttl);
nyatla 103:853ddf4a1b81 464 return l + 2 + 2 + 4;
nyatla 37:fc4b4fd6a649 465 }
nyatla 37:fc4b4fd6a649 466
nyatla 98:6284ce9a0476 467 /**
nyatla 103:853ddf4a1b81 468 * パケットヘッダを書き込みます。
nyatla 103:853ddf4a1b81 469 * @return パケットサイズ
nyatla 103:853ddf4a1b81 470 */
nyatla 103:853ddf4a1b81 471 static NyLPC_TUInt16 setResponseHeader(char* i_packet, const struct NyLPC_TDnsHeader* i_in_dns_header, NyLPC_TUInt16 i_an_count, NyLPC_TUInt16 i_ns_count, NyLPC_TUInt16 i_ar_count)
nyatla 37:fc4b4fd6a649 472 {
nyatla 103:853ddf4a1b81 473 struct NyLPC_TDnsHeader* p = (struct NyLPC_TDnsHeader*)i_packet;
nyatla 103:853ddf4a1b81 474 if (i_in_dns_header != NULL){
nyatla 103:853ddf4a1b81 475 memcpy(p, i_in_dns_header, sizeof(struct NyLPC_TDnsHeader));
nyatla 103:853ddf4a1b81 476 p->flag = p->flag | NyLPC_HTONS(NyLPC_TDnsHeader_FLAG_MASK_QR | NyLPC_TDnsHeader_FLAG_MASK_AA);
nyatla 103:853ddf4a1b81 477 p->flag = p->flag & NyLPC_HTONS(~(NyLPC_TDnsHeader_FLAG_MASK_RECODE | NyLPC_TDnsHeader_FLAG_MASK_TC | NyLPC_TDnsHeader_FLAG_MASK_RA));
nyatla 37:fc4b4fd6a649 478 }
nyatla 103:853ddf4a1b81 479 else{
nyatla 103:853ddf4a1b81 480 p->flag = 0;
nyatla 103:853ddf4a1b81 481 p->id = 0;
nyatla 103:853ddf4a1b81 482 }
nyatla 103:853ddf4a1b81 483 p->qd = 0;
nyatla 103:853ddf4a1b81 484 p->an = NyLPC_HTONS(i_an_count);
nyatla 103:853ddf4a1b81 485 p->ns = NyLPC_HTONS(i_ns_count);
nyatla 103:853ddf4a1b81 486 p->ar = NyLPC_HTONS(i_ar_count);
nyatla 37:fc4b4fd6a649 487 return sizeof(struct NyLPC_TDnsHeader);
nyatla 37:fc4b4fd6a649 488 }
nyatla 108:8dae2a2682e7 489 static NyLPC_TUInt16 setAnnounceHeader(char* i_packet,NyLPC_TUInt16 i_an_count, NyLPC_TUInt16 i_ns_count, NyLPC_TUInt16 i_ar_count)
nyatla 108:8dae2a2682e7 490 {
nyatla 108:8dae2a2682e7 491 struct NyLPC_TDnsHeader* p = (struct NyLPC_TDnsHeader*)i_packet;
nyatla 108:8dae2a2682e7 492 p->id = 0;
nyatla 108:8dae2a2682e7 493 p->flag = NyLPC_HTONS(NyLPC_TDnsHeader_FLAG_MASK_QR | NyLPC_TDnsHeader_FLAG_MASK_AA);
nyatla 108:8dae2a2682e7 494 p->qd = 0;
nyatla 108:8dae2a2682e7 495 p->an = NyLPC_HTONS(i_an_count);
nyatla 108:8dae2a2682e7 496 p->ns = NyLPC_HTONS(i_ns_count);
nyatla 108:8dae2a2682e7 497 p->ar = NyLPC_HTONS(i_ar_count);
nyatla 108:8dae2a2682e7 498 return sizeof(struct NyLPC_TDnsHeader);
nyatla 108:8dae2a2682e7 499 }
nyatla 104:4f4781ecdc79 500
nyatla 104:4f4781ecdc79 501 static NyLPC_TInt16 writeARecordData(char* i_packet, NyLPC_TInt16 i_spos,NyLPC_TInt16 obuflen,const struct NyLPC_TIPv4Addr* ip)
nyatla 37:fc4b4fd6a649 502 {
nyatla 104:4f4781ecdc79 503 NyLPC_TInt16 l=i_spos;
nyatla 103:853ddf4a1b81 504 (*(NyLPC_TUInt16*)(i_packet + l)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QTYPR_A);
nyatla 103:853ddf4a1b81 505 (*(NyLPC_TUInt16*)(i_packet + l + 2)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QCLASS_IN | NyLPC_TDnsQuestion_QCLASS_CACHE_FLUSH);
nyatla 104:4f4781ecdc79 506 (*(NyLPC_TUInt32*)(i_packet + l + 4)) = NyLPC_HTONL(NyLPC_TcMDns_RES_TTL);
nyatla 103:853ddf4a1b81 507 l += 2 + 2 + 4;
nyatla 37:fc4b4fd6a649 508 //A record header
nyatla 103:853ddf4a1b81 509 if (obuflen<l + 6){
nyatla 37:fc4b4fd6a649 510 return 0;
nyatla 37:fc4b4fd6a649 511 }
nyatla 37:fc4b4fd6a649 512 //Aレコードを書く
nyatla 37:fc4b4fd6a649 513 //IPADDR
nyatla 103:853ddf4a1b81 514 (*(NyLPC_TUInt16*)(i_packet + l)) = NyLPC_HTONS(4);
nyatla 103:853ddf4a1b81 515 (*(NyLPC_TUInt32*)(i_packet + l + 2)) = ip->v;
nyatla 104:4f4781ecdc79 516 return l + 6;//NEXT_SPOS
nyatla 104:4f4781ecdc79 517 }
nyatla 104:4f4781ecdc79 518 /**
nyatla 104:4f4781ecdc79 519 * ドメイン名からAレコードレスポンスを書きだす。
nyatla 104:4f4781ecdc79 520 */
nyatla 104:4f4781ecdc79 521 static NyLPC_TInt16 writeARecord(char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen, const NyLPC_TChar* i_name, const struct NyLPC_TIPv4Addr* ip)
nyatla 104:4f4781ecdc79 522 {
nyatla 104:4f4781ecdc79 523 //AnswerはAレコードのみ
nyatla 104:4f4781ecdc79 524 NyLPC_TInt16 s = 1 + (NyLPC_TInt16)strlen(i_name) + 1 + 5 + 1;
nyatla 104:4f4781ecdc79 525 if (obuflen<i_spos + s + 4 + 4){
nyatla 104:4f4781ecdc79 526 return 0;
nyatla 104:4f4781ecdc79 527 }
nyatla 104:4f4781ecdc79 528 s = str2label(i_packet + i_spos, i_name) - 1;
nyatla 104:4f4781ecdc79 529 s += str2label(i_packet + i_spos + s, "local");
nyatla 104:4f4781ecdc79 530 //レコード圧縮
nyatla 104:4f4781ecdc79 531 s = compressName(i_packet, i_spos, s);
nyatla 104:4f4781ecdc79 532 return writeARecordData(i_packet,s,obuflen,ip);
nyatla 37:fc4b4fd6a649 533 }
nyatla 102:41a5e92e0a8e 534
nyatla 101:5022828ace54 535 /**
nyatla 103:853ddf4a1b81 536 * AレコードクエリからAレコードレスポンスを書きだす。
nyatla 103:853ddf4a1b81 537 */
nyatla 103:853ddf4a1b81 538 static NyLPC_TInt16 writeARecordByQuery(char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen, const struct NyLPC_TDnsQuestion* i_query, const struct NyLPC_TIPv4Addr* ip)
nyatla 101:5022828ace54 539 {
nyatla 104:4f4781ecdc79 540 NyLPC_TInt16 s = query2label(i_packet, i_spos, obuflen, i_query);
nyatla 103:853ddf4a1b81 541 if (s == 0){
nyatla 102:41a5e92e0a8e 542 return 0;
nyatla 101:5022828ace54 543 }
nyatla 101:5022828ace54 544 //レコード圧縮
nyatla 104:4f4781ecdc79 545 s = compressName(i_packet, i_spos, s);
nyatla 104:4f4781ecdc79 546 return writeARecordData(i_packet,s,obuflen,ip);
nyatla 101:5022828ace54 547 }
nyatla 98:6284ce9a0476 548
nyatla 104:4f4781ecdc79 549 /*
nyatla 104:4f4781ecdc79 550 static NyLPC_TInt16 writeAAAARecordByQueryData(char* i_packet, NyLPC_TInt16 i_spos,NyLPC_TInt16 obuflen,const struct NyLPC_TIPv4Addr* ip)
nyatla 102:41a5e92e0a8e 551 {
nyatla 104:4f4781ecdc79 552 NyLPC_TInt16 l=i_spos;
nyatla 103:853ddf4a1b81 553 (*(NyLPC_TUInt16*)(i_packet + l)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QTYPR_AAAA);
nyatla 103:853ddf4a1b81 554 (*(NyLPC_TUInt16*)(i_packet + l + 2)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QCLASS_IN | NyLPC_TDnsQuestion_QCLASS_CACHE_FLUSH);
nyatla 104:4f4781ecdc79 555 (*(NyLPC_TUInt32*)(i_packet + l + 4)) = NyLPC_HTONL(NyLPC_TcMDns_RES_TTL);
nyatla 103:853ddf4a1b81 556 l += 2 + 2 + 4;
nyatla 102:41a5e92e0a8e 557 //A record header
nyatla 103:853ddf4a1b81 558 if (obuflen<l + 2 + 16){
nyatla 103:853ddf4a1b81 559 return 0;
nyatla 103:853ddf4a1b81 560 }
nyatla 103:853ddf4a1b81 561 //AAAAレコードを書く
nyatla 103:853ddf4a1b81 562 //IPADDR
nyatla 103:853ddf4a1b81 563 (*(NyLPC_TUInt16*)(i_packet + l)) = NyLPC_HTONS(16);
nyatla 103:853ddf4a1b81 564 memset(i_packet + l + 2, 0, 10);
nyatla 103:853ddf4a1b81 565 (*(NyLPC_TUInt16*)(i_packet + l + 2 + 10)) = 0xffff;
nyatla 103:853ddf4a1b81 566 (*(NyLPC_TUInt32*)(i_packet + l + 2 + 12)) = ip->v;
nyatla 103:853ddf4a1b81 567 return l + 2 + 16;
nyatla 104:4f4781ecdc79 568 }*/
nyatla 104:4f4781ecdc79 569
nyatla 104:4f4781ecdc79 570
nyatla 103:853ddf4a1b81 571 /**
nyatla 103:853ddf4a1b81 572 * AレコードクエリからAレコードレスポンスを書きだす。
nyatla 104:4f4781ecdc79 573 *//*
nyatla 104:4f4781ecdc79 574 static NyLPC_TInt16 writeAAAARecordByQuery(char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen, const struct NyLPC_TDnsQuestion* i_query, const struct NyLPC_TIPv4Addr* ip)
nyatla 104:4f4781ecdc79 575 {
nyatla 104:4f4781ecdc79 576 NyLPC_TInt16 s = query2label(i_packet, i_spos, obuflen, i_query);
nyatla 104:4f4781ecdc79 577 if (s == 0){
nyatla 104:4f4781ecdc79 578 return 0;
nyatla 104:4f4781ecdc79 579 }
nyatla 104:4f4781ecdc79 580 //レコード圧縮
nyatla 104:4f4781ecdc79 581 s = compressName(i_packet, i_spos, s);
nyatla 104:4f4781ecdc79 582 return writeAAAARecordByQueryData(i_packet,s,obuflen,ip);
nyatla 104:4f4781ecdc79 583 }*/
nyatla 104:4f4781ecdc79 584 /**
nyatla 104:4f4781ecdc79 585 * AレコードクエリからAレコードレスポンスを書きだす。
nyatla 104:4f4781ecdc79 586 *//*
nyatla 103:853ddf4a1b81 587 static NyLPC_TInt16 writeAAAARecord(char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen, const NyLPC_TChar* i_name, const struct NyLPC_TIPv4Addr* ip)
nyatla 103:853ddf4a1b81 588 {
nyatla 104:4f4781ecdc79 589 NyLPC_TInt16 s = 1 + (NyLPC_TInt16)strlen(i_name) + 1 + 5 + 1;
nyatla 104:4f4781ecdc79 590 if (obuflen<i_spos + s + 4 + 4){
nyatla 103:853ddf4a1b81 591 return 0;
nyatla 103:853ddf4a1b81 592 }
nyatla 103:853ddf4a1b81 593 s = str2label(i_packet + i_spos, i_name) - 1;
nyatla 103:853ddf4a1b81 594 s += str2label(i_packet + i_spos + s, "local");
nyatla 104:4f4781ecdc79 595 //レコード圧縮
nyatla 104:4f4781ecdc79 596 s = compressName(i_packet, i_spos, s);
nyatla 104:4f4781ecdc79 597 return writeAAAARecordByQueryData(i_packet,s,obuflen,ip);
nyatla 104:4f4781ecdc79 598 }*/
nyatla 103:853ddf4a1b81 599
nyatla 104:4f4781ecdc79 600 static NyLPC_TInt16 writeNSECRecordData(char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen,NyLPC_TInt16 i_next_domain)
nyatla 102:41a5e92e0a8e 601 {
nyatla 104:4f4781ecdc79 602 NyLPC_TInt16 l=i_spos;
nyatla 103:853ddf4a1b81 603 (*(NyLPC_TUInt16*)(i_packet + l)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QTYPR_NSEC);
nyatla 103:853ddf4a1b81 604 (*(NyLPC_TUInt16*)(i_packet + l + 2)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QCLASS_IN | NyLPC_TDnsQuestion_QCLASS_CACHE_FLUSH);
nyatla 104:4f4781ecdc79 605 (*(NyLPC_TUInt32*)(i_packet + l + 4)) = NyLPC_HTONL(NyLPC_TcMDns_RES_TTL);
nyatla 103:853ddf4a1b81 606 l += 2 + 2 + 4;
nyatla 102:41a5e92e0a8e 607 //A record header
nyatla 103:853ddf4a1b81 608 if (obuflen<l + 2 + 2 + 6){
nyatla 102:41a5e92e0a8e 609 return 0;
nyatla 102:41a5e92e0a8e 610 }
nyatla 102:41a5e92e0a8e 611 //NSECレコードを書く
nyatla 103:853ddf4a1b81 612 *((NyLPC_TUInt16*)(i_packet + l)) = NyLPC_HTONS(2 + 6);
nyatla 103:853ddf4a1b81 613 l += 2;
nyatla 103:853ddf4a1b81 614 *(i_packet + l) = 0xc0;
nyatla 104:4f4781ecdc79 615 *(i_packet + l + 1) = (NyLPC_TUInt8)i_next_domain;
nyatla 103:853ddf4a1b81 616 l += 2;
nyatla 103:853ddf4a1b81 617 memcpy(i_packet + l, "\x00\x04\x00\x00\x00\x08", 6);
nyatla 109:18f12ac01097 618 return l + 6;
nyatla 104:4f4781ecdc79 619 }
nyatla 104:4f4781ecdc79 620 /**
nyatla 104:4f4781ecdc79 621 * NSECレコードレスポンスを書きだす。
nyatla 104:4f4781ecdc79 622 * IPv6わからんし。
nyatla 104:4f4781ecdc79 623 */
nyatla 104:4f4781ecdc79 624 static NyLPC_TInt16 writeNSECRecord(char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen, const NyLPC_TChar* i_name)
nyatla 104:4f4781ecdc79 625 {
nyatla 104:4f4781ecdc79 626 //AnswerはAレコードのみ
nyatla 104:4f4781ecdc79 627 NyLPC_TInt16 s = 1 + (NyLPC_TInt16)strlen(i_name) + 1 + 5 + 1;
nyatla 104:4f4781ecdc79 628 if (obuflen<i_spos + s + 4 + 4){
nyatla 104:4f4781ecdc79 629 return 0;
nyatla 104:4f4781ecdc79 630 }
nyatla 104:4f4781ecdc79 631 s = str2label(i_packet + i_spos, i_name) - 1;
nyatla 104:4f4781ecdc79 632 s += str2label(i_packet + i_spos + s, "local");
nyatla 104:4f4781ecdc79 633 //レコード圧縮
nyatla 104:4f4781ecdc79 634 s = i_spos + s;//compressName(i_packet,i_spos,s);
nyatla 104:4f4781ecdc79 635 return writeNSECRecordData(i_packet,s,obuflen,i_spos);
nyatla 102:41a5e92e0a8e 636 }
nyatla 102:41a5e92e0a8e 637 /**
nyatla 103:853ddf4a1b81 638 * NSECレコードレスポンスを書きだす。
nyatla 103:853ddf4a1b81 639 * IPv6わからんし。
nyatla 103:853ddf4a1b81 640 */
nyatla 103:853ddf4a1b81 641 static NyLPC_TInt16 writeNSECRecordByQuery(char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen, const struct NyLPC_TDnsQuestion* i_query)
nyatla 102:41a5e92e0a8e 642 {
nyatla 102:41a5e92e0a8e 643 NyLPC_TInt16 s;
nyatla 102:41a5e92e0a8e 644 //AnswerはAレコードのみ
nyatla 103:853ddf4a1b81 645 s = query2label(i_packet, i_spos, obuflen, i_query);
nyatla 103:853ddf4a1b81 646 if (s == 0){
nyatla 102:41a5e92e0a8e 647 return 0;
nyatla 102:41a5e92e0a8e 648 }
nyatla 102:41a5e92e0a8e 649
nyatla 102:41a5e92e0a8e 650 //レコード圧縮
nyatla 104:4f4781ecdc79 651 s = i_spos + s;
nyatla 103:853ddf4a1b81 652 // l=compressName(i_packet,i_spos,s);
nyatla 104:4f4781ecdc79 653 return writeNSECRecordData(i_packet,s,obuflen,i_spos);
nyatla 102:41a5e92e0a8e 654 }
nyatla 104:4f4781ecdc79 655
nyatla 106:dc0d65dbde48 656 static NyLPC_TInt16 writeSdPtrRecord(const struct NyLPC_TMDnsServiceRecord* i_srvlec, char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen)
nyatla 37:fc4b4fd6a649 657 {
nyatla 103:853ddf4a1b81 658 NyLPC_TInt16 l, s;
nyatla 106:dc0d65dbde48 659 NyLPC_TUInt16* rlen;
nyatla 37:fc4b4fd6a649 660 //Header
nyatla 103:853ddf4a1b81 661 // s=(NyLPC_TInt16)*(i_question->buf+i_question->qname_pos);
nyatla 37:fc4b4fd6a649 662 //Headerの長さチェック
nyatla 103:853ddf4a1b81 663 if (obuflen<i_spos + 30 + 2 + 2 + 4){
nyatla 37:fc4b4fd6a649 664 return 0;
nyatla 37:fc4b4fd6a649 665 }
nyatla 37:fc4b4fd6a649 666 //Header書込み
nyatla 103:853ddf4a1b81 667 memcpy(i_packet + i_spos, "\x09_services\x07_dns-sd\x04_udp\x05local\x00", 30);
nyatla 103:853ddf4a1b81 668 s = compressName(i_packet, i_spos, 30);
nyatla 103:853ddf4a1b81 669 (*(NyLPC_TUInt16*)(i_packet + s)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QTYPR_PTR);
nyatla 103:853ddf4a1b81 670 (*(NyLPC_TUInt16*)(i_packet + s + 2)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QCLASS_IN);
nyatla 104:4f4781ecdc79 671 (*(NyLPC_TUInt32*)(i_packet + s + 4)) = NyLPC_HTONL(NyLPC_TcMDns_STD_TTL);
nyatla 103:853ddf4a1b81 672 l = s + 2 + 2 + 4;
nyatla 37:fc4b4fd6a649 673
nyatla 37:fc4b4fd6a649 674 //Resourceの書込み
nyatla 103:853ddf4a1b81 675 s = (NyLPC_TInt16)(1 + strlen(i_srvlec->protocol) + 1 + 5 + 1);//逆引き文字列の長さ(デリミタ×3+1)
nyatla 103:853ddf4a1b81 676 if (obuflen<s + l + 2){
nyatla 37:fc4b4fd6a649 677 return 0;
nyatla 37:fc4b4fd6a649 678 }
nyatla 106:dc0d65dbde48 679 rlen=(NyLPC_TUInt16*)(i_packet + l);
nyatla 103:853ddf4a1b81 680 l += 2;
nyatla 103:853ddf4a1b81 681 s = str2label(i_packet + l, i_srvlec->protocol) - 1;
nyatla 103:853ddf4a1b81 682 s += str2label(i_packet + l + s, "local");
nyatla 103:853ddf4a1b81 683 s = compressName(i_packet, l, s);//圧縮
nyatla 106:dc0d65dbde48 684 *rlen = NyLPC_ntohs(s - l);
nyatla 98:6284ce9a0476 685 return s;
nyatla 37:fc4b4fd6a649 686 }
nyatla 104:4f4781ecdc79 687
nyatla 103:853ddf4a1b81 688 static NyLPC_TInt16 writePtrRecord(const struct NyLPC_TDnsRecord* i_recode, NyLPC_TInt16 i_sid, char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen)
nyatla 37:fc4b4fd6a649 689 {
nyatla 103:853ddf4a1b81 690 NyLPC_TInt16 l, s;
nyatla 37:fc4b4fd6a649 691 NyLPC_TUInt16* rlen;
nyatla 37:fc4b4fd6a649 692 //Header:開始文字数(1)+プレフィクス(n)+終端(1)+local(5)+1
nyatla 103:853ddf4a1b81 693 s = (NyLPC_TInt16)(1 + strlen(i_recode->srv[i_sid].protocol) + 1 + 5 + 1);
nyatla 37:fc4b4fd6a649 694 //Headerの長さチェック
nyatla 103:853ddf4a1b81 695 if (obuflen<i_spos + s + 2 + 2 + 4){
nyatla 37:fc4b4fd6a649 696 return 0;
nyatla 37:fc4b4fd6a649 697 }
nyatla 37:fc4b4fd6a649 698 //Header書込み
nyatla 103:853ddf4a1b81 699 s = str2label(i_packet + i_spos, i_recode->srv[i_sid].protocol) - 1;
nyatla 103:853ddf4a1b81 700 s += str2label(i_packet + i_spos + s, "local");
nyatla 103:853ddf4a1b81 701 s = compressName(i_packet, i_spos, s);
nyatla 103:853ddf4a1b81 702 (*(NyLPC_TUInt16*)(i_packet + s)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QTYPR_PTR);
nyatla 103:853ddf4a1b81 703 (*(NyLPC_TUInt16*)(i_packet + s + 2)) = NyLPC_HTONS(NyLPC_TDnsQuestion_QCLASS_IN);
nyatla 104:4f4781ecdc79 704 (*(NyLPC_TUInt32*)(i_packet + s + 4)) = NyLPC_HTONL(NyLPC_TcMDns_STD_TTL);
nyatla 103:853ddf4a1b81 705 l = s + 2 + 2 + 4;
nyatla 37:fc4b4fd6a649 706
nyatla 37:fc4b4fd6a649 707 //Resourceの書込み
nyatla 103:853ddf4a1b81 708 s = (NyLPC_TInt16)(1 + strlen(i_recode->name) + 1 + strlen(i_recode->srv[i_sid].protocol) + 1 + 5 + 1);//逆引き文字列の長さ(デリミタ×3+1)
nyatla 103:853ddf4a1b81 709 if (obuflen<s + l + 2){
nyatla 37:fc4b4fd6a649 710 return 0;
nyatla 37:fc4b4fd6a649 711 }
nyatla 103:853ddf4a1b81 712 rlen = (NyLPC_TUInt16*)(i_packet + l);
nyatla 103:853ddf4a1b81 713 l += 2;
nyatla 103:853ddf4a1b81 714 s = str2label(i_packet + l, i_recode->name) - 1;
nyatla 103:853ddf4a1b81 715 s += str2label(i_packet + l + s, i_recode->srv[i_sid].protocol) - 1;
nyatla 103:853ddf4a1b81 716 s += str2label(i_packet + l + s, "local");
nyatla 103:853ddf4a1b81 717 s = compressName(i_packet, l, s);//圧縮
nyatla 103:853ddf4a1b81 718 (*rlen) = NyLPC_ntohs(s - l);
nyatla 98:6284ce9a0476 719 return s;
nyatla 37:fc4b4fd6a649 720 }
nyatla 37:fc4b4fd6a649 721
nyatla 103:853ddf4a1b81 722 static NyLPC_TInt16 writeSRVRecord(NyLPC_TcMDnsServer_t* i_inst, NyLPC_TInt16 i_sid, char* i_packet, NyLPC_TUInt16 i_spos, NyLPC_TInt16 obuflen)
nyatla 37:fc4b4fd6a649 723 {
nyatla 103:853ddf4a1b81 724 NyLPC_TInt16 l, s;
nyatla 37:fc4b4fd6a649 725 NyLPC_TUInt16* rlen;
nyatla 37:fc4b4fd6a649 726
nyatla 37:fc4b4fd6a649 727 //SRV Record
nyatla 104:4f4781ecdc79 728 s = writeSrvResourceHeader(i_packet, i_spos, obuflen, i_inst->_ref_record, i_sid, NyLPC_TDnsQuestion_QTYPR_SRV, NyLPC_TDnsQuestion_QCLASS_IN | NyLPC_TDnsQuestion_QCLASS_CACHE_FLUSH,NyLPC_TcMDns_RES_TTL);
nyatla 103:853ddf4a1b81 729 if (s == 0){
nyatla 37:fc4b4fd6a649 730 return 0;
nyatla 37:fc4b4fd6a649 731 }
nyatla 37:fc4b4fd6a649 732
nyatla 103:853ddf4a1b81 733 l = (NyLPC_TInt16)(1 + strlen(i_inst->_ref_record->a) + 1 + 5 + 1);//逆引き文字列の長さ(デリミタ×3+1)
nyatla 103:853ddf4a1b81 734 if (obuflen<s + 8 + l){
nyatla 37:fc4b4fd6a649 735 return 0;
nyatla 37:fc4b4fd6a649 736 }
nyatla 37:fc4b4fd6a649 737 //IPADDR
nyatla 103:853ddf4a1b81 738 rlen = (NyLPC_TUInt16*)(i_packet + s);
nyatla 103:853ddf4a1b81 739 (*(NyLPC_TUInt16*)(i_packet + s + 2)) = NyLPC_HTONS(0);//Priority
nyatla 103:853ddf4a1b81 740 (*(NyLPC_TUInt16*)(i_packet + s + 4)) = NyLPC_HTONS(0);//Weight
nyatla 103:853ddf4a1b81 741 (*(NyLPC_TUInt16*)(i_packet + s + 6)) = NyLPC_HTONS(i_inst->_ref_record->srv[i_sid].port);//PORT
nyatla 103:853ddf4a1b81 742 l = 4 * 2 + s;
nyatla 103:853ddf4a1b81 743 s = str2label(i_packet + l, i_inst->_ref_record->a) - 1;
nyatla 103:853ddf4a1b81 744 s += str2label(i_packet + l + s, "local");
nyatla 103:853ddf4a1b81 745 s = compressName(i_packet, l, s);//圧縮
nyatla 103:853ddf4a1b81 746 (*rlen) = NyLPC_HTONS(2 + 2 + 2 + (s - l));
nyatla 98:6284ce9a0476 747 return s;
nyatla 37:fc4b4fd6a649 748 }
nyatla 103:853ddf4a1b81 749 static NyLPC_TInt16 writeTXTRecord(NyLPC_TcMDnsServer_t* i_inst, NyLPC_TInt16 i_sid, char* i_packet, NyLPC_TInt16 i_spos, NyLPC_TInt16 obuflen)
nyatla 37:fc4b4fd6a649 750 {
nyatla 37:fc4b4fd6a649 751 NyLPC_TInt16 ret;
nyatla 37:fc4b4fd6a649 752 NyLPC_TInt16 l;
nyatla 37:fc4b4fd6a649 753 //Answer
nyatla 104:4f4781ecdc79 754 ret = writeSrvResourceHeader(i_packet, i_spos, obuflen, i_inst->_ref_record, i_sid, NyLPC_TDnsQuestion_QTYPR_TXT, NyLPC_TDnsQuestion_QCLASS_IN | NyLPC_TDnsQuestion_QCLASS_CACHE_FLUSH,NyLPC_TcMDns_STD_TTL);
nyatla 103:853ddf4a1b81 755 if (ret == 0){
nyatla 37:fc4b4fd6a649 756 return 0;
nyatla 37:fc4b4fd6a649 757 }
nyatla 37:fc4b4fd6a649 758 //name.proto.localを返す。
nyatla 103:853ddf4a1b81 759 if (obuflen<ret + 2){
nyatla 37:fc4b4fd6a649 760 return 0;
nyatla 37:fc4b4fd6a649 761 }
nyatla 103:853ddf4a1b81 762 (*(NyLPC_TUInt16*)(i_packet + ret)) = NyLPC_ntohs(0);
nyatla 37:fc4b4fd6a649 763 //proto.name.local.
nyatla 103:853ddf4a1b81 764 l = ret + 2;
nyatla 37:fc4b4fd6a649 765 return l;
nyatla 37:fc4b4fd6a649 766 }
nyatla 37:fc4b4fd6a649 767
nyatla 37:fc4b4fd6a649 768
nyatla 37:fc4b4fd6a649 769
nyatla 37:fc4b4fd6a649 770
nyatla 37:fc4b4fd6a649 771
nyatla 37:fc4b4fd6a649 772
nyatla 37:fc4b4fd6a649 773 static void sendAnnounse(NyLPC_TcMDnsServer_t* i_inst)
nyatla 37:fc4b4fd6a649 774 {
nyatla 37:fc4b4fd6a649 775 char* obuf;
nyatla 37:fc4b4fd6a649 776 NyLPC_TUInt16 obuflen;
nyatla 98:6284ce9a0476 777 NyLPC_TUInt16 l;
nyatla 106:dc0d65dbde48 778 int i,i2;
nyatla 37:fc4b4fd6a649 779 for(i2=0;i2<i_inst->_ref_record->num_of_srv;i2++){
nyatla 37:fc4b4fd6a649 780 //Bufferの取得
nyatla 109:18f12ac01097 781 obuf=NyLPC_iUdpSocket_allocSendBuf(i_inst->_socket,512,&obuflen,TIMEOUT_IN_MS);
nyatla 37:fc4b4fd6a649 782 if(obuf==NULL){
nyatla 37:fc4b4fd6a649 783 return;
nyatla 37:fc4b4fd6a649 784 }
nyatla 108:8dae2a2682e7 785 l=setAnnounceHeader(obuf,1+i_inst->_ref_record->num_of_srv+4,0,0);
nyatla 106:dc0d65dbde48 786 //<Answer />
nyatla 106:dc0d65dbde48 787 //PTR
nyatla 98:6284ce9a0476 788 l=writePtrRecord(i_inst->_ref_record,i2,obuf,l,obuflen);
nyatla 106:dc0d65dbde48 789 //SD-PTR
nyatla 98:6284ce9a0476 790 if(l<=0){
nyatla 37:fc4b4fd6a649 791 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 792 }
nyatla 106:dc0d65dbde48 793 for (i = 0; i<i_inst->_ref_record->num_of_srv; i++){
nyatla 106:dc0d65dbde48 794 l = writeSdPtrRecord(&(i_inst->_ref_record->srv[i]), obuf, l, obuflen);
nyatla 106:dc0d65dbde48 795 if (l <= 0){
nyatla 106:dc0d65dbde48 796 NyLPC_OnErrorGoto(ERROR);
nyatla 106:dc0d65dbde48 797 }
nyatla 106:dc0d65dbde48 798 }
nyatla 106:dc0d65dbde48 799 //<Additional/>
nyatla 102:41a5e92e0a8e 800 //SRV
nyatla 98:6284ce9a0476 801 l=writeSRVRecord(i_inst,i2,obuf,l,obuflen);
nyatla 98:6284ce9a0476 802 if(l<=0){
nyatla 37:fc4b4fd6a649 803 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 804 }
nyatla 102:41a5e92e0a8e 805 //TXT
nyatla 98:6284ce9a0476 806 l=writeTXTRecord(i_inst,i2,obuf,l,obuflen);
nyatla 98:6284ce9a0476 807 if(l<=0){
nyatla 37:fc4b4fd6a649 808 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 809 }
nyatla 37:fc4b4fd6a649 810 //Aレコード
nyatla 109:18f12ac01097 811 l=writeARecord(obuf,l,obuflen,i_inst->_ref_record->a,NyLPC_iUdpSocket_getSockIP(i_inst->_socket));
nyatla 98:6284ce9a0476 812 if(l<=0){
nyatla 37:fc4b4fd6a649 813 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 814 }
nyatla 104:4f4781ecdc79 815 // //AAAAレコード
nyatla 104:4f4781ecdc79 816 // l=writeAAAARecord(obuf,l,obuflen,i_inst->_ref_record->a,&(i_inst->_super.uip_udp_conn.lipaddr));
nyatla 104:4f4781ecdc79 817 // if(l<=0){
nyatla 104:4f4781ecdc79 818 // NyLPC_OnErrorGoto(ERROR);
nyatla 104:4f4781ecdc79 819 // }
nyatla 102:41a5e92e0a8e 820 //NSEC
nyatla 102:41a5e92e0a8e 821 l=writeNSECRecord(obuf,l,obuflen,i_inst->_ref_record->a);
nyatla 102:41a5e92e0a8e 822 if(l<=0){
nyatla 102:41a5e92e0a8e 823 NyLPC_OnErrorGoto(ERROR);
nyatla 102:41a5e92e0a8e 824 }
nyatla 109:18f12ac01097 825 if(!NyLPC_iUdpSocket_psend(i_inst->_socket,&MDNS_MCAST_IPADDR,MDNS_MCAST_PORT,obuf,l)){
nyatla 37:fc4b4fd6a649 826 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 827 }
nyatla 37:fc4b4fd6a649 828 }
nyatla 37:fc4b4fd6a649 829 return;
nyatla 37:fc4b4fd6a649 830 ERROR:
nyatla 109:18f12ac01097 831 NyLPC_iUdpSocket_releaseSendBuf(i_inst->_socket,obuf);
nyatla 37:fc4b4fd6a649 832 return;
nyatla 37:fc4b4fd6a649 833 }
nyatla 37:fc4b4fd6a649 834
nyatla 37:fc4b4fd6a649 835
nyatla 98:6284ce9a0476 836
nyatla 103:853ddf4a1b81 837 static void sendReply2(NyLPC_TcMDnsServer_t* i_inst, const struct NyLPC_TDnsHeader* i_dns_header, const struct NyLPC_TDnsQuestion* q)
nyatla 37:fc4b4fd6a649 838 {
nyatla 37:fc4b4fd6a649 839 NyLPC_TInt16 ptr_recode;
nyatla 37:fc4b4fd6a649 840 NyLPC_TInt16 i2;
nyatla 37:fc4b4fd6a649 841 char* obuf;
nyatla 37:fc4b4fd6a649 842 NyLPC_TUInt16 obuflen;
nyatla 98:6284ce9a0476 843 NyLPC_TUInt16 l;
nyatla 37:fc4b4fd6a649 844 //パケットヘッダの生成
nyatla 103:853ddf4a1b81 845 switch (q->qtype){
nyatla 37:fc4b4fd6a649 846 case NyLPC_TDnsQuestion_QTYPR_SRV:
nyatla 103:853ddf4a1b81 847 //
nyatla 103:853ddf4a1b81 848 ptr_recode = NyLPC_TDnsRecord_getMatchSrvIdx(i_inst->_ref_record, q);
nyatla 103:853ddf4a1b81 849 if (ptr_recode<0){
nyatla 37:fc4b4fd6a649 850 goto DROP;
nyatla 37:fc4b4fd6a649 851 }
nyatla 37:fc4b4fd6a649 852 //Bufferの取得
nyatla 109:18f12ac01097 853 obuf = NyLPC_iUdpSocket_allocSendBuf(i_inst->_socket, 512, &obuflen, 0);
nyatla 103:853ddf4a1b81 854 if (obuf == NULL){
nyatla 37:fc4b4fd6a649 855 goto DROP;
nyatla 37:fc4b4fd6a649 856 }
nyatla 103:853ddf4a1b81 857 //SRV,(TXT,A,AAAA,NSEC)
nyatla 104:4f4781ecdc79 858 l = setResponseHeader(obuf, i_dns_header, 1, 0, 3);
nyatla 103:853ddf4a1b81 859 l = writeSRVRecord(i_inst, ptr_recode, obuf, l, obuflen);
nyatla 103:853ddf4a1b81 860 if (l <= 0){
nyatla 37:fc4b4fd6a649 861 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 862 }
nyatla 103:853ddf4a1b81 863 l = writeTXTRecord(i_inst, ptr_recode, obuf, l, obuflen);
nyatla 103:853ddf4a1b81 864 if (l <= 0){
nyatla 37:fc4b4fd6a649 865 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 866 }
nyatla 37:fc4b4fd6a649 867 //Aレコード
nyatla 109:18f12ac01097 868 l = writeARecord(obuf, l, obuflen, i_inst->_ref_record->a, NyLPC_iUdpSocket_getSockIP(i_inst->_socket));
nyatla 103:853ddf4a1b81 869 if (l <= 0){
nyatla 103:853ddf4a1b81 870 NyLPC_OnErrorGoto(ERROR);
nyatla 103:853ddf4a1b81 871 }
nyatla 104:4f4781ecdc79 872 // //AAAAレコード
nyatla 104:4f4781ecdc79 873 // l = writeAAAARecord(obuf, l, obuflen, i_inst->_ref_record->a, &(i_inst->_super.uip_udp_conn.lipaddr));
nyatla 104:4f4781ecdc79 874 // if (l <= 0){
nyatla 104:4f4781ecdc79 875 // NyLPC_OnErrorGoto(ERROR);
nyatla 104:4f4781ecdc79 876 // }
nyatla 102:41a5e92e0a8e 877 //NSEC
nyatla 103:853ddf4a1b81 878 l = writeNSECRecord(obuf, l, obuflen, i_inst->_ref_record->a);
nyatla 103:853ddf4a1b81 879 if (l <= 0){
nyatla 102:41a5e92e0a8e 880 NyLPC_OnErrorGoto(ERROR);
nyatla 103:853ddf4a1b81 881 }
nyatla 102:41a5e92e0a8e 882 break;
nyatla 104:4f4781ecdc79 883 /* case NyLPC_TDnsQuestion_QTYPR_AAAA:
nyatla 102:41a5e92e0a8e 884 //自分宛?(name.local)
nyatla 103:853ddf4a1b81 885 if (!NyLPC_TDnsQuestion_isEqualName(q, i_inst->_ref_record->a, "")){
nyatla 102:41a5e92e0a8e 886 goto DROP;
nyatla 102:41a5e92e0a8e 887 }
nyatla 102:41a5e92e0a8e 888 //Bufferの取得
nyatla 103:853ddf4a1b81 889 obuf = NyLPC_cUdpSocket_allocSendBuf(&(i_inst->_super), 512, &obuflen, 0);
nyatla 103:853ddf4a1b81 890 if (obuf == NULL){
nyatla 102:41a5e92e0a8e 891 goto DROP;
nyatla 102:41a5e92e0a8e 892 }
nyatla 102:41a5e92e0a8e 893 //Headerのコピー
nyatla 103:853ddf4a1b81 894 //AAAA,(A,NSEC)
nyatla 103:853ddf4a1b81 895 l = setResponseHeader(obuf, i_dns_header, 1, 0, 2);
nyatla 102:41a5e92e0a8e 896 //AAAAレコード
nyatla 103:853ddf4a1b81 897 l = writeAAAARecordByQuery(obuf, l, obuflen, q, &(i_inst->_super.uip_udp_conn.lipaddr));
nyatla 103:853ddf4a1b81 898 if (l <= 0){
nyatla 103:853ddf4a1b81 899 NyLPC_OnErrorGoto(ERROR);
nyatla 103:853ddf4a1b81 900 }
nyatla 103:853ddf4a1b81 901 //Aレコードのみ
nyatla 103:853ddf4a1b81 902 l = writeARecordByQuery(obuf, l, obuflen, q, &(i_inst->_super.uip_udp_conn.lipaddr));
nyatla 103:853ddf4a1b81 903 if (l <= 0){
nyatla 102:41a5e92e0a8e 904 NyLPC_OnErrorGoto(ERROR);
nyatla 102:41a5e92e0a8e 905 }
nyatla 102:41a5e92e0a8e 906 //NSEC
nyatla 103:853ddf4a1b81 907 l = writeNSECRecordByQuery(obuf, l, obuflen, q);
nyatla 103:853ddf4a1b81 908 if (l <= 0){
nyatla 102:41a5e92e0a8e 909 NyLPC_OnErrorGoto(ERROR);
nyatla 102:41a5e92e0a8e 910 }
nyatla 104:4f4781ecdc79 911 break;*/
nyatla 37:fc4b4fd6a649 912 case NyLPC_TDnsQuestion_QTYPR_A:
nyatla 37:fc4b4fd6a649 913 //自分宛?(name.local)
nyatla 103:853ddf4a1b81 914 if (!NyLPC_TDnsQuestion_isEqualName(q, i_inst->_ref_record->a, "")){
nyatla 37:fc4b4fd6a649 915 goto DROP;
nyatla 37:fc4b4fd6a649 916 }
nyatla 37:fc4b4fd6a649 917 //Bufferの取得
nyatla 109:18f12ac01097 918 obuf = NyLPC_iUdpSocket_allocSendBuf(i_inst->_socket, 512, &obuflen, 0);
nyatla 103:853ddf4a1b81 919 if (obuf == NULL){
nyatla 37:fc4b4fd6a649 920 goto DROP;
nyatla 37:fc4b4fd6a649 921 }
nyatla 37:fc4b4fd6a649 922 //Headerのコピー
nyatla 103:853ddf4a1b81 923 l = setResponseHeader(obuf, i_dns_header, 1, 0, 1);
nyatla 103:853ddf4a1b81 924 //A、(NSEC
nyatla 109:18f12ac01097 925 l = writeARecordByQuery(obuf, l, obuflen, q, NyLPC_iUdpSocket_getSockIP(i_inst->_socket));
nyatla 103:853ddf4a1b81 926 if (l <= 0){
nyatla 37:fc4b4fd6a649 927 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 928 }
nyatla 103:853ddf4a1b81 929 l = writeNSECRecordByQuery(obuf, l, obuflen, q);
nyatla 103:853ddf4a1b81 930 if (l <= 0){
nyatla 102:41a5e92e0a8e 931 NyLPC_OnErrorGoto(ERROR);
nyatla 103:853ddf4a1b81 932 }
nyatla 37:fc4b4fd6a649 933 break;
nyatla 37:fc4b4fd6a649 934 case NyLPC_TDnsQuestion_QTYPR_PTR:
nyatla 98:6284ce9a0476 935 //_service._dns-sd._udpかどうか
nyatla 103:853ddf4a1b81 936 if (NyLPC_TDnsQuestion_isEqualName(q, NULL, "_services._dns-sd._udp")){
nyatla 37:fc4b4fd6a649 937 //Bufferの取得
nyatla 109:18f12ac01097 938 obuf = NyLPC_iUdpSocket_allocSendBuf(i_inst->_socket, 512, &obuflen, 0);
nyatla 103:853ddf4a1b81 939 if (obuf == NULL){
nyatla 37:fc4b4fd6a649 940 goto DROP;
nyatla 37:fc4b4fd6a649 941 }
nyatla 103:853ddf4a1b81 942 l = setResponseHeader(obuf, i_dns_header, i_inst->_ref_record->num_of_srv, 0, 0);
nyatla 103:853ddf4a1b81 943 for (i2 = 0; i2<i_inst->_ref_record->num_of_srv; i2++){
nyatla 106:dc0d65dbde48 944 l = writeSdPtrRecord(&(i_inst->_ref_record->srv[i2]), obuf, l, obuflen);
nyatla 103:853ddf4a1b81 945 if (l <= 0){
nyatla 37:fc4b4fd6a649 946 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 947 }
nyatla 37:fc4b4fd6a649 948 }
nyatla 103:853ddf4a1b81 949 }
nyatla 103:853ddf4a1b81 950 else{
nyatla 37:fc4b4fd6a649 951 //自分宛?(proto.local)
nyatla 103:853ddf4a1b81 952 ptr_recode = NyLPC_TDnsRecord_getMatchPtrIdx(i_inst->_ref_record, q);
nyatla 103:853ddf4a1b81 953 if (ptr_recode<0){
nyatla 37:fc4b4fd6a649 954 goto DROP;
nyatla 37:fc4b4fd6a649 955 }
nyatla 37:fc4b4fd6a649 956 //Bufferの取得
nyatla 109:18f12ac01097 957 obuf = NyLPC_iUdpSocket_allocSendBuf(i_inst->_socket, 512, &obuflen, 0);
nyatla 103:853ddf4a1b81 958 if (obuf == NULL){
nyatla 37:fc4b4fd6a649 959 goto DROP;
nyatla 37:fc4b4fd6a649 960 }
nyatla 104:4f4781ecdc79 961 l = setResponseHeader(obuf, i_dns_header, 1, 0, 4);
nyatla 103:853ddf4a1b81 962 l = writePtrRecord(i_inst->_ref_record, ptr_recode, obuf, l, obuflen);
nyatla 103:853ddf4a1b81 963 if (l <= 0){
nyatla 37:fc4b4fd6a649 964 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 965 }
nyatla 103:853ddf4a1b81 966 //SRV
nyatla 103:853ddf4a1b81 967 l = writeSRVRecord(i_inst, ptr_recode, obuf, l, obuflen);
nyatla 103:853ddf4a1b81 968 if (l <= 0){
nyatla 37:fc4b4fd6a649 969 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 970 }
nyatla 103:853ddf4a1b81 971 //TXT
nyatla 103:853ddf4a1b81 972 l = writeTXTRecord(i_inst, ptr_recode, obuf, l, obuflen);
nyatla 103:853ddf4a1b81 973 if (l <= 0){
nyatla 37:fc4b4fd6a649 974 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 975 }
nyatla 37:fc4b4fd6a649 976 //Aレコード
nyatla 109:18f12ac01097 977 l = writeARecord(obuf, l, obuflen, i_inst->_ref_record->a,NyLPC_iUdpSocket_getSockIP(i_inst->_socket));
nyatla 103:853ddf4a1b81 978 if (l <= 0){
nyatla 37:fc4b4fd6a649 979 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 980 }
nyatla 104:4f4781ecdc79 981 // //AAAAレコード
nyatla 104:4f4781ecdc79 982 // l = writeAAAARecord(obuf, l, obuflen, i_inst->_ref_record->a, &(i_inst->_super.uip_udp_conn.lipaddr));
nyatla 104:4f4781ecdc79 983 // if (l <= 0){
nyatla 104:4f4781ecdc79 984 // NyLPC_OnErrorGoto(ERROR);
nyatla 104:4f4781ecdc79 985 // }
nyatla 103:853ddf4a1b81 986 //NSEC
nyatla 103:853ddf4a1b81 987 l = writeNSECRecord(obuf, l, obuflen, i_inst->_ref_record->a);
nyatla 103:853ddf4a1b81 988 if (l <= 0){
nyatla 102:41a5e92e0a8e 989 NyLPC_OnErrorGoto(ERROR);
nyatla 102:41a5e92e0a8e 990 }
nyatla 37:fc4b4fd6a649 991 }
nyatla 37:fc4b4fd6a649 992 break;
nyatla 37:fc4b4fd6a649 993 case NyLPC_TDnsQuestion_QTYPR_TXT:
nyatla 37:fc4b4fd6a649 994 //自分宛?(proto.local)
nyatla 103:853ddf4a1b81 995 ptr_recode = NyLPC_TDnsRecord_getMatchSrvIdx(i_inst->_ref_record, q);
nyatla 103:853ddf4a1b81 996 if (ptr_recode<0){
nyatla 37:fc4b4fd6a649 997 goto DROP;
nyatla 37:fc4b4fd6a649 998 }
nyatla 37:fc4b4fd6a649 999 //Bufferの取得
nyatla 109:18f12ac01097 1000 obuf = NyLPC_iUdpSocket_allocSendBuf(i_inst->_socket, 512, &obuflen, 0);
nyatla 104:4f4781ecdc79 1001 l = setResponseHeader(obuf, i_dns_header, 1, 0, 2);
nyatla 103:853ddf4a1b81 1002 l = writeTXTRecord(i_inst, ptr_recode, obuf, l, obuflen);
nyatla 103:853ddf4a1b81 1003 if (l <= 0){
nyatla 37:fc4b4fd6a649 1004 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 1005 }
nyatla 103:853ddf4a1b81 1006 //A recoad
nyatla 109:18f12ac01097 1007 l = writeARecord(obuf, l, obuflen, i_inst->_ref_record->a,NyLPC_iUdpSocket_getSockIP(i_inst->_socket));
nyatla 103:853ddf4a1b81 1008 if (l <= 0){
nyatla 37:fc4b4fd6a649 1009 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 1010 }
nyatla 104:4f4781ecdc79 1011 // //AAAAレコード
nyatla 104:4f4781ecdc79 1012 // l = writeAAAARecord(obuf, l, obuflen, i_inst->_ref_record->a, &(i_inst->_super.uip_udp_conn.lipaddr));
nyatla 104:4f4781ecdc79 1013 // if (l <= 0){
nyatla 104:4f4781ecdc79 1014 // NyLPC_OnErrorGoto(ERROR);
nyatla 104:4f4781ecdc79 1015 // }
nyatla 103:853ddf4a1b81 1016 //NSEC
nyatla 103:853ddf4a1b81 1017 l = writeNSECRecord(obuf, l, obuflen, i_inst->_ref_record->a);
nyatla 103:853ddf4a1b81 1018 if (l <= 0){
nyatla 102:41a5e92e0a8e 1019 NyLPC_OnErrorGoto(ERROR);
nyatla 102:41a5e92e0a8e 1020 }
nyatla 37:fc4b4fd6a649 1021 break;
nyatla 37:fc4b4fd6a649 1022 default:
nyatla 37:fc4b4fd6a649 1023 goto DROP;
nyatla 37:fc4b4fd6a649 1024 }
nyatla 109:18f12ac01097 1025 if (!NyLPC_iUdpSocket_psend(i_inst->_socket, &MDNS_MCAST_IPADDR, MDNS_MCAST_PORT, obuf, l)){
nyatla 37:fc4b4fd6a649 1026 NyLPC_OnErrorGoto(ERROR);
nyatla 37:fc4b4fd6a649 1027 }
nyatla 37:fc4b4fd6a649 1028 return;
nyatla 37:fc4b4fd6a649 1029 ERROR:
nyatla 109:18f12ac01097 1030 NyLPC_iUdpSocket_releaseSendBuf(i_inst->_socket, obuf);
nyatla 37:fc4b4fd6a649 1031 DROP:
nyatla 37:fc4b4fd6a649 1032 return;
nyatla 37:fc4b4fd6a649 1033 }
nyatla 107:d4b14febb863 1034 #define ST_INIT 1 //初期QUERY送信(省略)
nyatla 107:d4b14febb863 1035 #define ST_ANNOUNCE 2 //アナウンス
nyatla 107:d4b14febb863 1036 #define ST_WAIT 3 //待機
nyatla 107:d4b14febb863 1037
nyatla 37:fc4b4fd6a649 1038
nyatla 109:18f12ac01097 1039 static NyLPC_TBool onPacket(NyLPC_TiUdpSocket_t* i_inst,const void* i_buf,const struct NyLPC_TIPv4RxInfo* i_info)
nyatla 37:fc4b4fd6a649 1040 {
nyatla 98:6284ce9a0476 1041 NyLPC_TUInt16 in_len;
nyatla 37:fc4b4fd6a649 1042 NyLPC_TUInt16 num_of_query;
nyatla 37:fc4b4fd6a649 1043 struct NyLPC_TDnsQuestion q;
nyatla 37:fc4b4fd6a649 1044 NyLPC_TUInt16 s;
nyatla 37:fc4b4fd6a649 1045 NyLPC_TInt16 i;
nyatla 37:fc4b4fd6a649 1046
nyatla 37:fc4b4fd6a649 1047 if(i_info->peer_port!=MDNS_MCAST_PORT || !NyLPC_TIPv4Addr_isEqual(&MDNS_MCAST_IPADDR,&i_info->ip)){
nyatla 37:fc4b4fd6a649 1048 return NyLPC_TBool_FALSE;
nyatla 37:fc4b4fd6a649 1049 }
nyatla 37:fc4b4fd6a649 1050
nyatla 98:6284ce9a0476 1051 num_of_query=getNumberOfQuestion(i_buf,i_info->size);
nyatla 37:fc4b4fd6a649 1052 if(num_of_query==0){
nyatla 37:fc4b4fd6a649 1053 goto DROP;
nyatla 37:fc4b4fd6a649 1054 }
nyatla 98:6284ce9a0476 1055 in_len=sizeof(struct NyLPC_TDnsHeader);
nyatla 37:fc4b4fd6a649 1056 for(i=0;i<num_of_query;i++){
nyatla 37:fc4b4fd6a649 1057 //Queryのパース
nyatla 98:6284ce9a0476 1058
nyatla 98:6284ce9a0476 1059 s=NyLPC_TDnsQuestion_parse(i_buf,i_info->size,in_len,&q);
nyatla 37:fc4b4fd6a649 1060 if(s==0){
nyatla 37:fc4b4fd6a649 1061 goto DROP;
nyatla 37:fc4b4fd6a649 1062 }
nyatla 98:6284ce9a0476 1063 in_len+=s;
nyatla 109:18f12ac01097 1064 sendReply2((NyLPC_TcMDnsServer_t*)i_inst->_tag,(const struct NyLPC_TDnsHeader*)i_buf,&q);
nyatla 37:fc4b4fd6a649 1065 }
nyatla 37:fc4b4fd6a649 1066 //パケット処理終了
nyatla 37:fc4b4fd6a649 1067 return NyLPC_TBool_FALSE;
nyatla 37:fc4b4fd6a649 1068 DROP:
nyatla 37:fc4b4fd6a649 1069 return NyLPC_TBool_FALSE;
nyatla 37:fc4b4fd6a649 1070 }
nyatla 37:fc4b4fd6a649 1071
nyatla 109:18f12ac01097 1072 static void onPeriodic(NyLPC_TiUdpSocket_t* i_inst)
nyatla 37:fc4b4fd6a649 1073 {
nyatla 109:18f12ac01097 1074 NyLPC_TcMDnsServer_t* inst=(NyLPC_TcMDnsServer_t*)i_inst->_tag;
nyatla 107:d4b14febb863 1075 //Announce Timeout
nyatla 107:d4b14febb863 1076 if(NyLPC_cStopwatch_isExpired(&((NyLPC_TcMDnsServer_t*)inst)->_periodic_sw)){
nyatla 107:d4b14febb863 1077 switch(inst->_state){
nyatla 107:d4b14febb863 1078 case ST_WAIT:
nyatla 107:d4b14febb863 1079 inst->_state_val=0;
nyatla 107:d4b14febb863 1080 inst->_state=ST_ANNOUNCE;// set Announce status
nyatla 107:d4b14febb863 1081 case ST_ANNOUNCE:
nyatla 107:d4b14febb863 1082 //アナウンス
nyatla 107:d4b14febb863 1083 inst->_state_val++;
nyatla 107:d4b14febb863 1084 if(inst->_state_val<=3){
nyatla 107:d4b14febb863 1085 sendAnnounse(((NyLPC_TcMDnsServer_t*)inst));
nyatla 107:d4b14febb863 1086 NyLPC_cStopwatch_startExpire((&((NyLPC_TcMDnsServer_t*)inst)->_periodic_sw),1000);
nyatla 107:d4b14febb863 1087 }else{
nyatla 107:d4b14febb863 1088 inst->_state=ST_WAIT;
nyatla 107:d4b14febb863 1089 //TTL(msec)*1000*80%
nyatla 107:d4b14febb863 1090 NyLPC_cStopwatch_startExpire((&((NyLPC_TcMDnsServer_t*)inst)->_periodic_sw),NyLPC_TcMDns_STD_TTL*1000*4/5);
nyatla 107:d4b14febb863 1091 }
nyatla 107:d4b14febb863 1092 }
nyatla 37:fc4b4fd6a649 1093 }
nyatla 37:fc4b4fd6a649 1094 }
nyatla 37:fc4b4fd6a649 1095
nyatla 37:fc4b4fd6a649 1096 NyLPC_TBool NyLPC_cMDnsServer_initialize(
nyatla 48:00d211aac2ec 1097 NyLPC_TcMDnsServer_t* i_inst,const struct NyLPC_TDnsRecord* i_ref_record)
nyatla 37:fc4b4fd6a649 1098 {
nyatla 37:fc4b4fd6a649 1099 NyLPC_cStopwatch_initialize(&(i_inst->_periodic_sw));
nyatla 37:fc4b4fd6a649 1100 NyLPC_cStopwatch_startExpire(&(i_inst->_periodic_sw),1000);
nyatla 110:257739f9b31e 1101 i_inst->_socket=NyLPC_cNet_createUdpSocketEx(MDNS_MCAST_PORT,NyLPC_TSocketType_UDP_NOBUF);
nyatla 109:18f12ac01097 1102 i_inst->_socket->_tag=i_inst;
nyatla 109:18f12ac01097 1103 NyLPC_iUdpSocket_setOnRxHandler(i_inst->_socket,onPacket);
nyatla 109:18f12ac01097 1104 NyLPC_iUdpSocket_setOnPeriodicHandler(i_inst->_socket,onPeriodic);
nyatla 109:18f12ac01097 1105 NyLPC_iUdpSocket_joinMulticast(i_inst->_socket,&MDNS_MCAST_IPADDR);
nyatla 107:d4b14febb863 1106 i_inst->_state=ST_WAIT;
nyatla 107:d4b14febb863 1107 i_inst->_state_val=0;
nyatla 37:fc4b4fd6a649 1108 i_inst->_ref_record=i_ref_record;
nyatla 37:fc4b4fd6a649 1109 return NyLPC_TBool_TRUE;
nyatla 37:fc4b4fd6a649 1110 }
nyatla 37:fc4b4fd6a649 1111 void NyLPC_cMDnsServer_finalize(
nyatla 37:fc4b4fd6a649 1112 NyLPC_TcMDnsServer_t* i_inst)
nyatla 37:fc4b4fd6a649 1113 {
nyatla 109:18f12ac01097 1114 NyLPC_iUdpSocket_finalize(i_inst->_socket);
nyatla 37:fc4b4fd6a649 1115 NyLPC_cStopwatch_finalize(&(i_inst->_periodic_sw));
nyatla 37:fc4b4fd6a649 1116 }
nyatla 37:fc4b4fd6a649 1117
nyatla 37:fc4b4fd6a649 1118
nyatla 37:fc4b4fd6a649 1119