Created
January 5, 2014 13:18
-
-
Save thehajime/8268095 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/example/dce-sctp-simple.cc b/example/dce-sctp-simple.cc | |
| new file mode 100644 | |
| --- /dev/null | |
| +++ b/example/dce-sctp-simple.cc | |
| @@ -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 --git a/example/sctp-client.cc b/example/sctp-client.cc | |
| new file mode 100644 | |
| --- /dev/null | |
| +++ b/example/sctp-client.cc | |
| @@ -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 --git a/example/sctp-server.cc b/example/sctp-server.cc | |
| new file mode 100644 | |
| --- /dev/null | |
| +++ b/example/sctp-server.cc | |
| @@ -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 --git a/wscript b/wscript | |
| --- a/wscript | |
| +++ b/wscript | |
| @@ -257,6 +257,8 @@ | |
| ['udp-echo-client', []], | |
| ['dccp-server', []], | |
| ['dccp-client', []], | |
| + ['sctp-server', ['sctp']], | |
| + ['sctp-client', ['sctp']], | |
| # ['little-cout', []], | |
| ] | |
| for name,lib in dce_examples: | |
| @@ -394,6 +396,10 @@ | |
| target='bin/simple-point-to-point-olsr', | |
| source=['example/simple-point-to-point-olsr.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] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment