1472バイトを超えるUDPパケットの送受信が失敗してしまう(μNet3/Compact版)

弊社TCP/IPプロトコルスタック「μNet3」に関するご質問
返信する
アバター
eForce技術担当
記事: 163
登録日時: 2014年4月24日(木) 14:18

1472バイトを超えるUDPパケットの送受信が失敗してしまう(μNet3/Compact版)

投稿記事 by eForce技術担当 » 2017年11月30日(木) 15:29

本手順は、μNet3/Compact版のパッケージの手順となります。
μNet3/Standard版をご使用の場合、1472バイトを超えるUDPパケットの送受信が失敗してしまう(μNet3/Standard版)を参照ください。
※使用した評価ボードのメモリ上限の関係で、32739バイトの送受信となっています。
 実際のμNet3のUDPフラグメントパケットの上限は65507バイトとなります。

32739バイト(※1)のUDPパケットの送受信など大きなフレームのやり取りをする場合は、
以下の手順を踏む事で実現する事が出来ます。
※1:20(IPヘッダ) + 8(UDPヘッダ) + 32739(ペイロード) = 32767

■ネットワークライブラリの再作成
ユーザが任意でネットワークバッファの確保処理やネットワークバッファの
大きさ、種類、それぞれの数を管理を行う機能を有効にするため以下の手順でμNet3ライブラリを再作成します。

1.「\Network\lib\M4\uNet3cortexm4.eww」などのソリューションファイルをIDEで起動

2.コンパイル時のプリプロセッサ定義に「EXT_ALOC_SUP」を追加
EXT_ALOC_SUP_setting_1.png
3.全ライブラリプロジェクトにプリプロセッサ定義を追加し、リビルドを行う
EXT_ALOC_SUP_setting_2.png
EXT_ALOC_SUP_setting_2.png (16.3 KiB) 閲覧された回数 2379 回
EXT_ALOC_SUP_setting_3.png
4.Configurator.exeにて、以下のリソース定義を追加/変更
Net_Configguration_1.png
Net_Configguration_2.png
Net_Configguration_3.png
Net_Configguration_4.png
5.「netmem_cfg.c」のソースファイルを追加し、以下のネットワークバッファ拡張管理処理を追加
Net_Configguration_5.png

コード: 全て選択

#include "kernel.h"
#include "net_hdr.h"
#include "net_sts.h"
#include "net_def.h"
#include "net_cfg.h"
#include "kernel_id.h"
#include "net_id.h"

#define NET_LARGE_BUF_SZ 32767 + 76;

ER net_memini(void)
{
    extern UW NET_BUF_SZ;
    
    NET_BUF_SZ = NET_LARGE_BUF_SZ;
    
    return E_OK;
}

ER net_memext(void)
{
    return E_OK;
}

ER net_memget(VP *adr, UINT len, TMO tmo, ID *id)
{
    if ( len > NET_BUF_SZ ) {
        return E_NOMEM;
    }

    if ( len > CFG_NET_BUF_SZ ) {
        *id = ID_NET_MPF_32767;
    } else {
        *id = ID_NET_MPF;
    }
    return tget_mpf( *id, adr, tmo );
}

ER net_memret(VP adr, ID id)
{
    return rel_mpf( id, adr );
}
6.32739バイトのパケットを送信するテストコードを追加
Net_Configguration_6.png

コード: 全て選択

    {
        static UB buf[32739];   /* 自動変数によるスタック消費回避の為、static */
        T_NODE remote = { 0 };

        remote.ver = IP_VER4;
        remote.num = 1;     /* ネットワークデバイス番号 */
        remote.ipa = ip_aton( "192.168.1.76" );
        remote.port = 12345;

        ercd = con_soc( ID_PROTO_UDP, &remote, 0 );
        ercd = snd_soc( ID_PROTO_UDP, &buf[0], 32739 );

        slp_tsk();
    }
7.Wireshark上で正常にパケットが送信されている事を確認
PacketCapture.png
8.32739バイトのパケットを受信するテストコードを追加
Net_Configguration_7.png

コード: 全て選択

    {
        static UB buf[32739];   /* 自動変数によるスタック消費回避の為、static */

        ercd = rcv_soc( ID_PROTO_UDP, &buf[0], sizeof(buf) );
        
        slp_tsk();
    }
9.32739バイトのパケットが受信される事を確認
Net_Configguration_8.png
Net_Configguration_8.png (8.91 KiB) 閲覧された回数 2379 回
■補足
65507バイトなど、より大きなUDPフラグメントパケットを送受信する場合は、
Configurator.exeの設定にて「ネットワークバッファの数」を増やしてください。

返信する