--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dce-sctp.patch Thu Jun 20 09:56:26 2013 +0900
@@ -0,0 +1,455 @@
+diff -r 4f91d96592e9 -r 8bc8c14ee22c example/dce-sctp-simple.cc
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/example/dce-sctp-simple.cc Fri Oct 12 10:45:01 2012 +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 <fstream>
++
++using namespace ns3;
++
++static void RunIp (Ptr<Node> 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 4f91d96592e9 -r 8bc8c14ee22c example/sctp-client.cc
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/example/sctp-client.cc Fri Oct 12 10:45:01 2012 +0900
+@@ -0,0 +1,89 @@
++//
++// libstcp1-dev is needed
++//
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h> /* for memset */
++#include <unistd.h> /* for memset */
++#include <sys/socket.h>
++#include <sys/types.h>
++#include <arpa/inet.h>
++#include <netinet/in.h>
++#include <netinet/sctp.h>
++
++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 < 2 ; 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 4f91d96592e9 -r 8bc8c14ee22c example/sctp-client.cc~
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/example/sctp-client.cc~ Fri Oct 12 10:45:01 2012 +0900
+@@ -0,0 +1,87 @@
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h> /* for memset */
++#include <unistd.h> /* for memset */
++#include <sys/socket.h>
++#include <sys/types.h>
++#include <arpa/inet.h>
++#include <netinet/in.h>
++#include <netinet/sctp.h>
++
++void my_exit (char *str)
++{
++ perror (str);
++ exit (1);
++}
++
++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)
++ {
++ my_exit ("setsockopt error");
++ }
++
++ 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 ("127.0.0.1");
++
++ stat = connect (connect_sock, (struct sockaddr *)&server_addr, sizeof(server_addr) );
++ if (stat < 0)
++ {
++ my_exit ("connect error");
++ }
++
++ 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)
++ {
++ my_exit ("event error");
++ }
++
++ 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 < 2 ; 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 4f91d96592e9 -r 8bc8c14ee22c example/sctp-server.cc
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/example/sctp-server.cc Fri Oct 12 10:45:01 2012 +0900
+@@ -0,0 +1,78 @@
++//
++// libstcp1-dev is needed
++//
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <sys/socket.h>
++#include <sys/types.h>
++#include <arpa/inet.h>
++#include <netinet/in.h>
++#include <netinet/sctp.h>
++
++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;
++
++ 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);
++
++ echo_main (sock_server);
++ }
++
++ close (sock_listen);
++ return 0;
++}
++
+diff -r 4f91d96592e9 -r 8bc8c14ee22c example/sctp-server.cc~
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/example/sctp-server.cc~ Fri Oct 12 10:45:01 2012 +0900
+@@ -0,0 +1,78 @@
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <sys/socket.h>
++#include <sys/types.h>
++#include <arpa/inet.h>
++#include <netinet/in.h>
++#include <netinet/sctp.h>
++
++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;
++
++ 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);
++
++ // bind() によるソケットとアドレスの関係づけ
++ stat = bind (sock_listen, (struct sockaddr *)&server_addr, sizeof(server_addr));
++
++ // SCTP のパラメータ
++ 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; // INIT 再送の最大数
++
++ // setsockopt() によるパラメータの設定
++ stat = setsockopt (sock_listen, IPPROTO_SCTP, SCTP_INITMSG,
++ &s_initmsg, sizeof(s_initmsg));
++ if (stat < 0)
++ {
++ my_exit ("Socket Option error");
++ }
++
++ // listen() による接続要求待機
++ listen (sock_listen, 5);
++ while (1)
++ {
++ printf ("SCTP server accepting\n");
++ // accept() による接続要求の受付
++ sock_server = accept (sock_listen, (struct sockaddr *)NULL, (int *)NULL);
++
++ // クライアント処理を行う関数の呼び出し
++ echo_main (sock_server);
++ }
++
++ close (sock_listen);
++ return 0;
++}
++
+diff -r 4f91d96592e9 -r 8bc8c14ee22c wscript
+--- a/wscript Thu Oct 11 12:14:09 2012 +0900
++++ b/wscript Fri Oct 12 10:45:01 2012 +0900
+@@ -232,6 +232,8 @@
+ ['unix-client', []],
+ ['udp-echo-server', []],
+ ['udp-echo-client', []],
++ ['sctp-server', ['sctp']],
++ ['sctp-client', ['sctp']],
+ # ['little-cout', []],
+ ]
+ for name,lib in dce_examples:
+@@ -316,6 +318,10 @@
+ target='bin/dce-linux',
+ source=['example/dce-linux.cc'])
+
++ 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]