SCTP Discussions

Text archives Help


Re: [SCTP-Discussion] sendto() Retransmission


Chronological Thread 
  • From: Michael Tuexen <Michael.Tuexen AT micmac.franken.de>
  • To: john.fitzpatrick4 AT mail.dcu.ie
  • Cc: discussion AT sctp.de
  • Subject: Re: [SCTP-Discussion] sendto() Retransmission
  • Date: Wed, 16 Jan 2008 21:44:51 +0100
  • List-archive: <http://lists.franken.de/pipermail/sctp-discussion>
  • List-id: SCTP Discussions <sctp-discussion.sctp.de>

Hi John,

see my comments in-line.

Best regards
Michael

On Jan 13, 2008, at 4:10 PM, John wrote:

Hi all,

I have a setup in which both client and server are multi-homed each with
three interfaces, A,B and C. Routing is done so that only interface A of
the client can reach interface A of the server, ditto for interfaces B
and C, essentially creating three independent links.

While A is set as the primary address I am using the sendto() function
to transmit from server to client over link B, I am attempting to
measure loss and RTT on link B. Unfortunately if the quality of link B
is poor SCTP is retransmitting packets over link C.

My question is this, is there a way to force SCTP to not retransmit
packets over an alternate link?
Not with the sctplib... It is the job of SCTP to select an appropriate
path... But you are free to change the code.


Can the RTO for each link be modified so that it will not be reached and
no retransmission over an alternate link will take place?
If you can arrange that the packet loss rate on path C is 100%, SCTP
will not chose it.


Would using a different stream for each link prevent retransmissions
over an alternate link?
The stream concept is not related to the path concept. So the answer is no.


Thanks in advance!

Kind Regards,
John Fitzpatrick

On Wed, 2007-12-05 at 14:59 +0000, john.fitzpatrick4 AT mail.dcu.ie wrote:
Solved:

I was not specifiying the sstat_assoc_id in addrinfo before calling
getsockopt.

Thanks all.

-- Original Message --
Date: Wed, 5 Dec 2007 12:29:15 +0000
From:
john.fitzpatrick4 AT mail.dcu.ie
To:
discussion AT sctp.de
Subject: [SCTP-Discussion] getsockopt() returning invalid argument


Hi all,

I am writing an application using LK-SCTP and the one-to-many style
sockets using SOCK_SEQPACKET. The problem I am having is when I am
calling getsockopt() it returns with an error saying invalid argument. I
have used the same call with the same parameters while using SOCK_STREAM
with no problems. The function call is -
getsockopt(sd, IPPROTO_SCTP, SCTP_STATUS, &addrinfo, &lenaddr)

Specifically I am going to use the getsockopt function to obtain an srtt
value, is this possible while using UPD style one-to-many sockets.

I have included sample code for both a Client/Server so that you can
recreate the problem to show the problem I am having, any help is
greatly appreciated.

Kind Regards,
John Fitzpatrick

//Client Start **************************************************
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/sctp.h>
#include <sys/uio.h>

int main(int argc, char **argv)
{
//Define Variables
int sd, port;
struct sockaddr_in sin;
struct sctp_event_subscribe event;

//Check Usage
if(argc != 3){
printf("\nUsage: <Server> <port>\n");
return -1;
}

//Create Socket
sd = socket(PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
if(sd < 0){
perror("Socket");
exit(1);
}

sin.sin_family = PF_INET;
port = atoi(argv[2]);
sin.sin_port = htons(port);
sin.sin_addr.s_addr = inet_addr(argv[1]);

//Set Socket Options
/* Enable all events */
event.sctp_data_io_event = 1;
event.sctp_association_event = 1;
event.sctp_address_event = 1;
event.sctp_send_failure_event = 1;
event.sctp_peer_error_event = 1;
event.sctp_shutdown_event = 1;
event.sctp_partial_delivery_event = 1;
event.sctp_adaption_layer_event = 1;

if (setsockopt(sd, IPPROTO_SCTP, SCTP_EVENTS, &event,
sizeof(event)) !=
0) {
perror("setevent failed");
exit(1);
}

//Connect
if(connect(sd, (struct sockaddr *) &sin, sizeof(sin)) < 0){
perror("Connect");
exit(1);
}

struct sctp_status addrinfo;
int lenaddr = sizeof(addrinfo);
int send_packet = 1;
int sz;
while(1){
sz = sctp_sendmsg(sd, (int *) &send_packet, sizeof(int),
(struct
sockaddr *) &sin, sizeof(struct sockaddr_in), 0, 0, 0, 100, 0);
send_packet++;

if(getsockopt(sd, IPPROTO_SCTP, SCTP_STATUS, &addrinfo,
&lenaddr) < 0){
perror("getsockopt");
}
}
}
//Client End **************************************************

//Server Start ************************************************
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/sctp.h>
#include <sys/uio.h>

int main(int argc, char **argv)
{
//Define Variables
int sd, bound, port;
struct sockaddr_in cli_addr, sin;
struct sctp_event_subscribe event;

//Check Usage
if(argc != 3){
printf("\nUsage: <Server> <port>\n");
return -1;
}

//Create Socket
sd = socket(PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
if(sd < 0){
perror("Socket");
exit(1);
}

sin.sin_family = PF_INET;
port = atoi(argv[2]);
sin.sin_port = htons(port);
sin.sin_addr.s_addr = inet_addr(argv[1]);

//Bind
bound = bind(sd, (struct sockaddr *) &sin, sizeof(sin));
printf("Bound = %d\n", bound);
if(bound < 0){
perror("Bind");
exit(1);
}

//Set Socket Options
/* Enable all events */
event.sctp_data_io_event = 1;
event.sctp_association_event = 1;
event.sctp_address_event = 1;
event.sctp_send_failure_event = 1;
event.sctp_peer_error_event = 1;
event.sctp_shutdown_event = 1;
event.sctp_partial_delivery_event = 1;
event.sctp_adaption_layer_event = 1;

if (setsockopt(sd, IPPROTO_SCTP, SCTP_EVENTS, &event,
sizeof(event)) !=
0) {
perror("setevent failed");
exit(1);
}

/* Listen to socket */
if(listen(sd, 4) < 0){
perror("Listen");
}

//Receive Message
int recv;
int recv_packet;
int lenaddress = sizeof(struct sockaddr_in);
while(1){
if(sctp_recvmsg(sd, (int*)&recv_packet,
sizeof(recv_packet),
&cli_addr, &lenaddress, NULL, 0) < 0)
perror("sctp_recvmsg");
printf("Recv: %d\n", recv_packet);
}
}
//Server End ************************************************


_______________________________________________
sctp-discussion mailing list
sctp-discussion AT sctp.de
http://www.sctp.de/mailman/listinfo/sctp-discussion


_______________________________________________
sctp-discussion mailing list
sctp-discussion AT sctp.de
http://www.sctp.de/mailman/listinfo/sctp-discussion

_______________________________________________
sctp-discussion mailing list
sctp-discussion AT sctp.de
http://www.sctp.de/mailman/listinfo/sctp-discussion





Archive powered by MHonArc 2.6.19+.

Top of page