# HG changeset patch # User Hajime Tazaki # Date 1389195465 -32400 # Node ID 9952fad1036b64e39663a897dcb0d37b15ebdcf6 # Parent 52a8727261c4b31284963d9c034e4008696564e6 Bug 1827 - Linux SCTP support over DCE diff -r 52a8727261c4 -r 9952fad1036b RELEASE_NOTES --- a/RELEASE_NOTES Thu Jan 09 00:37:44 2014 +0900 +++ b/RELEASE_NOTES Thu Jan 09 00:37:45 2014 +0900 @@ -24,11 +24,15 @@ New user-visible features ------------------------- +- LinuxStackHelper now can configure IPv6 addresses with the support of Ipv6AddressHelper - DCE Cradle now support IPv6 sockets (TCP6, UDP6, RAW6, DCCP6) +- Stream Control Transmission Protocol (SCTP) support + you need to install lksctp-dev/lksctp-tools-devel to run example. Bugs fixed ---------- - Bug 1713 - Ipv6 address configuration support for LinuxStackHelper +- Bug 1827 - Linux SCTP support over DCE Release dce-1.2 ============= diff -r 52a8727261c4 -r 9952fad1036b example/dce-sctp-simple.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/dce-sctp-simple.cc Thu Jan 09 00:37:45 2014 +0900 @@ -0,0 +1,80 @@ +#include "ns3/core-module.h" +#include "ns3/network-module.h" +#include "ns3/dce-module.h" +#include "ns3/point-to-point-module.h" +#include "ns3/internet-module.h" +#include + +using namespace ns3; + +static void RunIp (Ptr node, Time at, std::string str) +{ + DceApplicationHelper process; + ApplicationContainer apps; + process.SetBinary ("ip"); + process.SetStackSize (1<<16); + process.ResetArguments(); + process.ParseArguments(str.c_str ()); + apps = process.Install (node); + apps.Start (at); +} + +int main (int argc, char *argv[]) +{ + CommandLine cmd; + cmd.Parse (argc, argv); + + NodeContainer nodes; + nodes.Create (2); + + NetDeviceContainer devices; + + PointToPointHelper p2p; + p2p.SetDeviceAttribute ("DataRate", StringValue ("5Gbps")); + p2p.SetChannelAttribute ("Delay", StringValue ("1ms")); + devices = p2p.Install (nodes); + p2p.EnablePcapAll ("dce-sctp-simple"); + + DceManagerHelper processManager; + processManager.SetTaskManagerAttribute ("FiberManagerType", + StringValue ("UcontextFiberManager")); + // processManager.SetLoader ("ns3::DlmLoaderFactory"); + processManager.SetNetworkStack("ns3::LinuxSocketFdFactory", "Library", StringValue ("liblinux.so")); + LinuxStackHelper stack; + stack.Install (nodes); + + Ipv4AddressHelper address; + address.SetBase ("10.0.0.0", "255.255.255.0"); + Ipv4InterfaceContainer interfaces = address.Assign (devices); + + processManager.Install (nodes); + + + for (int n=0; n < 2; n++) + { + RunIp (nodes.Get (n), Seconds (0.2), "link show"); + RunIp (nodes.Get (n), Seconds (0.3), "route show table all"); + RunIp (nodes.Get (n), Seconds (0.4), "addr list"); + } + + DceApplicationHelper process; + ApplicationContainer apps; + + process.SetBinary ("sctp-server"); + process.ResetArguments (); + process.SetStackSize (1<<16); + apps = process.Install (nodes.Get (0)); + apps.Start (Seconds (1.0)); + + process.SetBinary ("sctp-client"); + process.ResetArguments (); + process.ParseArguments ("10.0.0.1"); + apps = process.Install (nodes.Get (1)); + apps.Start (Seconds (1.5)); + + Simulator::Stop (Seconds (2000000.0)); + Simulator::Run (); + Simulator::Destroy (); + + return 0; +} diff -r 52a8727261c4 -r 9952fad1036b example/examples-to-run.py --- a/example/examples-to-run.py Thu Jan 09 00:37:44 2014 +0900 +++ b/example/examples-to-run.py Thu Jan 09 00:37:45 2014 +0900 @@ -81,6 +81,7 @@ # ("dce-mptcp-lte-wifi", "True", "True"), ("dce-httpd", "True", "True"), ("dce-wifi-ccnx", "True", "True"), + ("dce-sctp-simple", "True", "True"), ] # A list of Python examples to run in order to ensure that they remain diff -r 52a8727261c4 -r 9952fad1036b example/sctp-client.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/sctp-client.cc Thu Jan 09 00:37:45 2014 +0900 @@ -0,0 +1,89 @@ +// +// libstcp1-dev is needed +// +#include +#include +#include /* for memset */ +#include /* for memset */ +#include +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + int connect_sock, stat, port, slen, i, flags; + struct sctp_initmsg initmsg; + struct sockaddr_in server_addr; + struct sctp_event_subscribe s_events; + struct sctp_status s_status; + struct sctp_sndrcvinfo s_sndrcvinfo; + char buffer[1024]; + + port = 3007; + + connect_sock = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP); + memset (&initmsg, 0, sizeof (initmsg)); + initmsg.sinit_num_ostreams = 3; // Number of Output Stream + initmsg.sinit_max_instreams = 3; // Number of Input Stream + initmsg.sinit_max_attempts = 4; + stat = setsockopt (connect_sock, IPPROTO_SCTP, SCTP_INITMSG, + &initmsg, sizeof (initmsg) ); + if (stat < 0) + { + perror ("setsockopt error"); + exit (-1); + } + + memset (&server_addr, 0, sizeof (server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons (port); + server_addr.sin_addr.s_addr = inet_addr (argv[1]); + + stat = connect (connect_sock, (struct sockaddr *)&server_addr, + sizeof (server_addr) ); + if (stat < 0) + { + perror ("connect error"); + exit (-1); + } + + memset (&s_events, 0, sizeof (s_events)); + s_events.sctp_data_io_event = 1; + stat = setsockopt (connect_sock, SOL_SCTP, SCTP_EVENTS, + (const void *)&s_events, sizeof (s_events)); + if (stat < 0) + { + perror ("event error"); + exit (-1); + } + + slen = sizeof (s_status); + stat = getsockopt (connect_sock, SOL_SCTP, SCTP_STATUS, + (void *)&s_status, (socklen_t *)&slen); + + printf ("assoc id = %d\n", s_status.sstat_assoc_id ); + printf ("state = %d\n", s_status.sstat_state ); + printf ("instrms = %d\n", s_status.sstat_instrms ); + printf ("outstrms = %d\n", s_status.sstat_outstrms ); + + + for (i = 0 ; i < 100 ; i++) + { + stat = sctp_recvmsg (connect_sock, (void *)buffer, sizeof (buffer), + (struct sockaddr *)NULL, 0, &s_sndrcvinfo, &flags); + printf ("stat = %d\n", stat); + if (stat > 0) + { + buffer[stat] = 0; + printf ("(Stream %d) %s\n", s_sndrcvinfo.sinfo_stream, buffer); + } + } + /* Close our socket and exit */ + close (connect_sock); + return 0; +} + + diff -r 52a8727261c4 -r 9952fad1036b example/sctp-server.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/sctp-server.cc Thu Jan 09 00:37:45 2014 +0900 @@ -0,0 +1,87 @@ +// +// libstcp1-dev is needed +// +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void +echo_main (int sock) +{ + int stat; + char buffer[1024]; + + printf ("sock: %d\n", sock); + + // Stream No.0 + sprintf (buffer, "This is a test of stream 0"); + stat = sctp_sendmsg (sock, buffer, (size_t)strlen (buffer), + NULL, 0, 0, 0, 0, 0, 0); + + // Stream No.1 + sprintf (buffer, "This is a test of stream 1"); + stat = sctp_sendmsg (sock, buffer, (size_t)strlen (buffer), + NULL, 0, 0, 0, 1, 0, 0); +} + +int +main (int argc, char **argv) +{ + int sock_listen, sock_server, stat; + struct sockaddr_in server_addr; + struct sctp_initmsg s_initmsg; + int echo_port; + int i = 0; + + echo_port = 3007; + + sock_listen = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP); + + memset (&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = htonl (INADDR_ANY); + server_addr.sin_port = htons (echo_port); + + stat = bind (sock_listen, (struct sockaddr *)&server_addr, sizeof(server_addr)); + + // SCTP parameter + memset (&s_initmsg, 0, sizeof(s_initmsg)); + s_initmsg.sinit_num_ostreams = 5; + s_initmsg.sinit_max_instreams = 5; + s_initmsg.sinit_max_attempts = 5; + + stat = setsockopt (sock_listen, IPPROTO_SCTP, SCTP_INITMSG, + &s_initmsg, sizeof(s_initmsg)); + if (stat < 0) + { + perror ("Socket Option error"); + exit (-1); + } + + listen (sock_listen, 5); + while (1) + { + printf ("SCTP server accepting\n"); + sock_server = accept (sock_listen, (struct sockaddr *)NULL, (socklen_t *)NULL); + if (sock_server == -1) + { + perror ("accept"); + exit (-1); + } + + for (i = 0 ; i < 100 ; i++) + { + echo_main (sock_server); + } + } + + close (sock_listen); + return 0; +} + diff -r 52a8727261c4 -r 9952fad1036b wscript --- a/wscript Thu Jan 09 00:37:44 2014 +0900 +++ b/wscript Thu Jan 09 00:37:45 2014 +0900 @@ -163,6 +163,16 @@ except WafError: pass + # sctp-tools check + have_sctp_tools = conf.check(header_name='netinet/sctp.h', + define_name='HAVE_SCTP_H', mandatory=False) + conf.env['SCTP_TOOLS_FOUND'] = True + if have_sctp_tools is None: + conf.env['SCTP_TOOLS_FOUND'] = False + ns3waf._report_optional_feature(conf, "sctp", "sctp-tools-dev", + have_sctp_tools, + "sctp-tools (netinet/sctp.h) not found") + conf.recurse(os.path.join('utils')) ns3waf.print_feature_summary(conf) @@ -281,6 +291,13 @@ ['dccp-client', []], # ['little-cout', []], ] + + if bld.env['SCTP_TOOLS_FOUND']: + dce_examples += [ + ['sctp-server', ['sctp']], + ['sctp-client', ['sctp']], + ] + for name,lib in dce_examples: module.add_example(**dce_kw(target = 'bin_dce/' + name, source = ['example/' + name + '.cc'], @@ -352,7 +369,7 @@ # target='bin/dce-cout-bug', # source=['example/dce-cout-bug.cc']) -def build_dce_kernel_examples(module): +def build_dce_kernel_examples(module, bld): module.add_example(needed = ['core', 'internet', 'dce', 'point-to-point'], target='bin/dce-udp-perf', source=['example/dce-udp-perf.cc']) @@ -427,6 +444,11 @@ target='bin/simple-point-to-point-olsr', source=['example/simple-point-to-point-olsr.cc']) + if bld.env['SCTP_TOOLS_FOUND']: + module.add_example(needed = ['core', 'network', 'dce', 'point-to-point' ], + target='bin/dce-sctp-simple', + source=['example/dce-sctp-simple.cc']) + # Add a script to build system def build_a_script(bld, name, needed = [], **kw): external = [i for i in needed if not i == name] @@ -642,7 +664,7 @@ name='netlink') if bld.env['KERNEL_STACK']: - build_dce_kernel_examples(module) + build_dce_kernel_examples(module, bld) # build test-runner module.add_example(target='bin/test-runner',