Re: [dtn-users] A problem with dtntunnel

"Zoller, David A. (MSFC-EO60)[HOSC SERVICES CONTRACT]" <david.a.zoller@nasa.gov> Mon, 17 December 2012 13:15 UTC

Return-Path: <david.a.zoller@nasa.gov>
X-Original-To: dtn-users@ietfa.amsl.com
Delivered-To: dtn-users@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 4FC8C21F8AB8 for <dtn-users@ietfa.amsl.com>; Mon, 17 Dec 2012 05:15:24 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -6.169
X-Spam-Level:
X-Spam-Status: No, score=-6.169 tagged_above=-999 required=5 tests=[AWL=-0.171, BAYES_00=-2.599, HTML_MESSAGE=0.001, J_CHICKENPOX_92=0.6, RCVD_IN_DNSWL_MED=-4]
Received: from mail.ietf.org ([64.170.98.30]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id aisu6KiF4LZX for <dtn-users@ietfa.amsl.com>; Mon, 17 Dec 2012 05:15:20 -0800 (PST)
Received: from ndmsnpf01.ndc.nasa.gov (ndmsnpf01.ndc.nasa.gov [198.117.0.121]) by ietfa.amsl.com (Postfix) with ESMTP id CD3D821F8AB0 for <dtn-users@irtf.org>; Mon, 17 Dec 2012 05:15:19 -0800 (PST)
Received: from ndmsppt02.ndc.nasa.gov (ndmsppt02.ndc.nasa.gov [198.117.0.101]) by ndmsnpf01.ndc.nasa.gov (Postfix) with ESMTP id 35CEC260286; Mon, 17 Dec 2012 07:15:19 -0600 (CST)
Received: from ndmshub03.ndc.nasa.gov (ndmshub03-pub.ndc.nasa.gov [198.117.0.42]) by ndmsppt02.ndc.nasa.gov (8.14.5/8.14.5) with ESMTP id qBHDFIs9015040; Mon, 17 Dec 2012 07:15:19 -0600
Received: from NDMSSCC05.ndc.nasa.gov ([198.117.2.174]) by ndmshub03.ndc.nasa.gov ([198.117.2.162]) with mapi; Mon, 17 Dec 2012 07:15:19 -0600
From: "Zoller, David A. (MSFC-EO60)[HOSC SERVICES CONTRACT]" <david.a.zoller@nasa.gov>
To: "ssireskin@gmail.com" <ssireskin@gmail.com>, David Zoller <zollerd@gmail.com>
Date: Mon, 17 Dec 2012 07:15:18 -0600
Thread-Topic: [dtn-users] A problem with dtntunnel
Thread-Index: Ac3cU6G/PYEyrcZETpS14MucqZ7OQAAAcm/g
Message-ID: <04E3D99A62496240BCD6A576813E6E31E0BDF5C59C@NDMSSCC05.ndc.nasa.gov>
References: <CA+X1Codj6FoKWPDj+giFK-6oa-pbCZ8LF2x9cZyW1OzBJNTAYw@mail.gmail.com> <CAJR8z99v9XUDZyCzy6uhg7zYHrig8B4E6SPW+i-FfSU2LJT6zA@mail.gmail.com>
In-Reply-To: <CAJR8z99v9XUDZyCzy6uhg7zYHrig8B4E6SPW+i-FfSU2LJT6zA@mail.gmail.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
acceptlanguage: en-US
Content-Type: multipart/alternative; boundary="_000_04E3D99A62496240BCD6A576813E6E31E0BDF5C59CNDMSSCC05ndcn_"
MIME-Version: 1.0
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.9.8327, 1.0.431, 0.0.0000 definitions=2012-12-17_02:2012-12-17, 2012-12-17, 1970-01-01 signatures=0
Cc: "dtn-users@irtf.org" <dtn-users@irtf.org>
Subject: Re: [dtn-users] A problem with dtntunnel
X-BeenThere: dtn-users@irtf.org
X-Mailman-Version: 2.1.12
Precedence: list
List-Id: "The Delay-Tolerant Networking Research Group \(DTNRG\) - Users." <dtn-users.irtf.org>
List-Unsubscribe: <https://www.irtf.org/mailman/options/dtn-users>, <mailto:dtn-users-request@irtf.org?subject=unsubscribe>
List-Archive: <http://www.irtf.org/mail-archive/web/dtn-users>
List-Post: <mailto:dtn-users@irtf.org>
List-Help: <mailto:dtn-users-request@irtf.org?subject=help>
List-Subscribe: <https://www.irtf.org/mailman/listinfo/dtn-users>, <mailto:dtn-users-request@irtf.org?subject=subscribe>
X-List-Received-Date: Mon, 17 Dec 2012 13:15:24 -0000

Hi Sergey,
I don't have your setup and this has not been tested but give this a try. In TCPTunnel::Connection::handle_bundle in the while(1) loop add the test to see if the next_seqno_ is a match:

    while (1) {
        iter = reorder_table_.find(next_seqno_);
        if (iter == reorder_table_.end()) {
            break;
        }

        // add this code:
        // if seqno does not match then still a bundle missing
        if (iter->first != next_seqno_) {
            break;
        }

        bundle = iter->second;
        log_debug("delivering %zu byte bundle with seqno %d (from reorder table)",
                  bundle->payload_.len(), next_seqno_);

        reorder_table_.erase(iter);
        next_seqno_++;

        queue_.push_back(bundle);
    }




David Zoller
COLSA Corporation
HOSC / C107
*Office: (256) 544-1820
*EMail: david.a.zoller@nasa.gov<mailto:david.a.zoller@nasa.gov>

From: dtn-users-bounces@irtf.org [mailto:dtn-users-bounces@irtf.org] On Behalf Of ssireskin@gmail.com
Sent: Monday, December 17, 2012 6:40 AM
To: David Zoller
Cc: dtn-users@irtf.org
Subject: Re: [dtn-users] A problem with dtntunnel

Hi David,

Thanks for your patch, it works! :) Connection is cleanly terminated now.

However, there still seems to be a problem. I run dtntunnel over a link with high latency and about 30% packet loss. The receiving nc sometimes gets FIN packet before it receives all the data. If I understand it right, on a lossy link bundles may come out of order. In this case the EOF bundle may come too early. I think that the reordering procedure in dtntunnel should be reviewed. Just for information, pure TCP performs better that DTN over this link.
2012/12/14 David Zoller <zollerd@gmail.com<mailto:zollerd@gmail.com>>
Hi Sergey,
I can't stay away from a problem that is nagging at me so I made some time this morning. Going back to the original TCPTunnel.cc code, when a bundle is received that has the EOF indication, an empty bundle with the same EOF flag set needs to be returned to close the loop (the second FIN). There may still be some loose ends or clean up needed but try the code below at the end of the while loop.

I did not do a packet capture but I saw that if the receiving nc is not running when you start the sender nc then the receiving dtntunnel logs an error on the failed connect and returns an EOF bundle which closes the sender nc. The EOF bundle could possibly be enhanced to include an error message.

I agree that some applications could benefit from a "pretend to be a receiver" option with the default working as a bidirectional end-to-end TCP connection.

Thanks for dragging me along kicking and screaming on this lesson in DTN and TCP tunneling. I've only been using dtntunnel as a one way UDP transmitter. I see a good fit for the TCP tunnel in an upcoming project and I'll try to make the pitch to use it. This is a pretty cool little app.
Best regards,
DZ





484             delete b_recv;
485
486             if (recv_hdr->eof_) {
487                 log_info("bundle had eof bit set... closing connection");
488
489                 if ( !sock_eof ) {
490                     sock_eof = true;
491                     // send an empty bundle back since we did not initiate the close
492                     dtn::APIBundle* b = new dtn::APIBundle();
493                     hdr.eof_ = 1;
494                     hdr.seqno_ = ntohl(send_seqno++);
495                     memcpy(b->payload_.buf(sizeof(hdr)), &hdr, sizeof(hdr));
496                     b->payload_.set_len(sizeof(hdr));
497                     int err;
498                     if ((err = tunnel->send_bundle(b, &dest_eid_)) != DTN_SUCCESS) {
499                         log_err("error sending final socket closed packet bundle: %s",
500                                 dtn_strerror(err));
501                         tcptun_->kill_connection(this);
502                         exit(1);
503                     }
504                     delete b;
505                 }
506                 sock_.close();
507                 goto done;
508             }
509         }
510     }
511
512  done:




--
Best regards,
Sergey Sireskin