Hi all,Not with the sctplib... It is the job of SCTP to select an appropriate
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?
If you can arrange that the packet loss rate on path C is 100%, SCTP
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?
The stream concept is not related to the path concept. So the answer is no.
Would using a different stream for each link prevent retransmissions
over an alternate link?
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+.