6655 TCP通信,1455数据上包被抛弃 - TMS320C665x - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3230|回复: 1
打印 上一主题 下一主题

6655 TCP通信,1455数据上包被抛弃

[复制链接]

1

主题

1

帖子

17

积分

新手上路

Rank: 1

积分
17
跳转到指定楼层
楼主
发表于 2016-9-29 16:37:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用创龙6655开发板带的例子NDK_Runtime,自己改了一个与dps互传文件的程序。
经过试验发现,通信过程中,如果pc发出的tcp包,包内数据长超过1455,则dsp端会抛弃这个包不做响应(mss为1460)。
dps端的接受动作为在Deamon中接受通信头以后按照通信头所指定的长度接受文件数据。
通信头固定长284,文件数据长度不定。

ndk的配置内容如下。

Void NDKTask(UArg a0, UArg a1)
{
    int rc;
    // 初始化操作系统环境
    // 必须在使用 NDK 之前最先调用
    rc = NC_SystemOpen(NC_PRIORITY_LOW, NC_OPMODE_INTERRUPT);
    if(rc)
    {
     printf("NC_SystemOpen Failed (%d)\n", rc);
        for(;;);
    }
    // 创建新的配置
    HANDLE hCfg;
    hCfg = CfgNew();
    if(!hCfg)
    {
     printf("Unable to create configuration\n");
        goto Exit;
    }
    // 配置主机名
    if(strlen( DomainName ) >= CFG_DOMAIN_MAX || strlen( HostName ) >= CFG_HOSTNAME_MAX)
    {
     printf("Names too long\n");
        goto Exit;
    }
    // 添加全局主机名到 hCfg(对所有连接域有效)
    CfgAddEntry(hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_HOSTNAME, 0, strlen(HostName), (UINT8 *)HostName, 0);
    {
  CI_IPNET NA;
  CI_ROUTE RT;
  IPN      IPTmp;
  // 配置 IP
  bzero(&NA, sizeof(NA));
  NA.IPAddr = inet_addr(StaticIPAddr);
  NA.IPMask = inet_addr(LocalIPMask);
  strcpy(NA.Domain, DomainName);
  NA.NetType = 0;
  // 添加地址到接口 1
  CfgAddEntry(hCfg, CFGTAG_IPNET, 1, 0, sizeof(CI_IPNET), (UINT8 *)&NA, 0);
  // 配置 默认网关
  bzero(&RT, sizeof(RT));
  RT.IPDestAddr = 0;
  RT.IPDestMask = 0;
  RT.IPGateAddr = inet_addr(GatewayIP);
  // 配置 路由
  CfgAddEntry(hCfg, CFGTAG_ROUTE, 0, 0, sizeof(CI_ROUTE), (UINT8 *)&RT, 0);
  // 配置 DNS 服务器
  IPTmp = inet_addr(DNSServer);
  if(IPTmp)
  CfgAddEntry(hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER, 0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0);
    }
    // 配置协议栈选项
    // 显示警告消息
    rc = DBG_INFO;
    CfgAddEntry(hCfg, CFGTAG_OS, CFGITEM_OS_DBGPRINTLEVEL, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
    rc = 8192;
    CfgAddEntry(hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPTXBUF, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
    // TCP 接收 buffer 大小(copy 模式)
    rc = 8192;
    CfgAddEntry(hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPRXBUF, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
    // TCP 接收限制大小(non-copy 模式)
    rc = 8192;
    CfgAddEntry(hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPRXLIMIT, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
    // UDP 接收限制大小
    rc = 8192;
    CfgAddEntry(hCfg, CFGTAG_IP, CFGITEM_IP_SOCKUDPRXLIMIT, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0);
    // 使用当前配置启动 NDK 网络
    do
    {
        rc = NC_NetStart(hCfg, NetworkOpen, NetworkClose, NetworkIPAddr);
    } while(rc > 0);
    // 停止消息
    printf("NDK Task has been stop(Return Code %d)!\r\n", rc);
    // 删除配置
    CfgFree(hCfg);
    // 退出
    goto Exit;
Exit:
    NC_SystemClose();
    TaskExit();
}

DSP端接收程序动作示例如下
以下函数由Deamon启动

#define FILE_TRANS_CMD_BUFF_SIZE 284
#define FILE_TRANS_DATA_BUFF_SIZE 1024

int ft_task( SOCKET wkst_s, UINT32 wku32_unused ){
    if ( ( wks32_rcvedsize = recv( wkst_s, &wkst_ftcmdbuf, FILE_TRANS_CMD_BUFF_SIZE, 0 ) ) > 0 )
    {
          do
           {
                    wks32_rcvsize = recv( wkst_s, wkpu8_databuff, FILE_TRANS_DATA_BUFF_SIZE, 0 );
                    if ( wks32_rcvsize > 0 )
                    {
                              //数据保存到ram,检查已接受文件长度是否等于wkst_ftcmdbuf中指定长度
                    }         
                    wku32_datasize += wks32_rcvsize;
            } while ( wks32_rcvsize == FILE_TRANS_DATA_BUFF_SIZE );
    }
}

试验过程中发现,传送文件较大时,PC会直接发出Jumbo Packet,这时候DSP不做响应,
而后PC端按照MSS重发数据,单个TCP包数据长为1460(帧总长1514),但是对于重发TCP包DSP依然不做响应,
DSP程序收不到数据,抓包也没有ACK。
后手动调整文件大小,当文件小于1455时(即,单个TCP包内数据长小于1455),能正常和DSP通信完成文件传递,
但是当文件大小处于1456(即,单个TCP包内数据大于1455)以上时,DSP不响应TCP包,无法完成数据传递。
同时,在发生dsp不响应的时候,tcp链接并没有关闭,之后的通信如果发送包为1455以下的包,依然能正常通信。

不知道这个问题应该如何解决?

抓包数据如下



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2016-9-29 20:58:59 | 只看该作者
默认情况下驱动及 NDK 协议栈不支持 Jumbo Packet
网络数据包大小必须小于 MTU 才能被接受
参考
http://processors.wiki.ti.com/in ... t_Support_for_C6678
重新编译驱动和协议栈
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-4-24 17:21 , Processed in 0.035131 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表