diff --git a/api/restapi/handler/loadbalancer.go b/api/restapi/handler/loadbalancer.go index 7d8f9407..120d735a 100644 --- a/api/restapi/handler/loadbalancer.go +++ b/api/restapi/handler/loadbalancer.go @@ -46,6 +46,10 @@ func ConfigPostLoadbalancer(params operations.PostConfigLoadbalancerParams) midd }) } + if lbRules.Serv.Mode == cmn.LBModeDSR && lbRules.Serv.Sel != cmn.LbSelHash { + return &ResultResponse{Result: "Error: Only Hash Selection criteria allowed for DSR mode"} + } + tk.LogIt(tk.LogDebug, "[API] lbRules : %v\n", lbRules) _, err := ApiHooks.NetLbRuleAdd(&lbRules) if err != nil { diff --git a/cicd/cluster2/validation.sh b/cicd/cluster2/validation.sh index 0d1fe5b5..d7b19ebe 100755 --- a/cicd/cluster2/validation.sh +++ b/cicd/cluster2/validation.sh @@ -49,7 +49,7 @@ function tcp_validate() { then echo "All TCP Servers are not UP" >&2 echo CLUSTER-2 [FAILED] >&2 - sudo pkill node + sudo pkill -9 node 2>&1 > /dev/null exit 1 fi fi @@ -91,9 +91,9 @@ function tcp_validate() { } function sctp_validate() { - $hexec ep1 ../common/sctp_server server1 & - $hexec ep2 ../common/sctp_server server2 & - $hexec ep3 ../common/sctp_server server3 & + $hexec ep1 ../common/sctp_server ${ep[0]} 8080 server1 >/dev/null 2>&1 & + $hexec ep2 ../common/sctp_server ${ep[1]} 8080 server2 >/dev/null 2>&1 & + $hexec ep3 ../common/sctp_server ${ep[2]} 8080 server3 >/dev/null 2>&1 & sleep 20 @@ -107,7 +107,7 @@ function sctp_validate() { else $hexec r2 ip route list match 20.20.20.1 >&2 echo "BGP Service Route [NOK]" >&2 - sudo pkill sctp_server + sudo pkill -9 sctp_server >/dev/null 2&1 return 1 fi @@ -117,7 +117,7 @@ function sctp_validate() { waitCount=0 while [ $j -le 2 ] do - res=$($hexec user timeout 10 ../common/sctp_client ${ep[j]} 8080) + res=$($hexec user timeout 10 ../common/sctp_client 1.1.1.1 0 ${ep[j]} 8080) if [[ $res == "${servArr[j]}" ]] then echo "$res UP" >&2 @@ -129,6 +129,7 @@ function sctp_validate() { then echo "All SCTP Servers are not UP" >&2 echo CLUSTER-2 [FAILED] >&2 + sudo pkill -9 sctp_server >/dev/null 2&1 exit 1 fi @@ -140,7 +141,7 @@ function sctp_validate() { do for j in {0..2} do - res=$($hexec user timeout 10 ../common/sctp_client 20.20.20.1 2020) + res=$($hexec user timeout 10 ../common/sctp_client 1.1.1.1 0 20.20.20.1 2020) echo -e $res >&2 ids=`echo "${res//[!0-9]/}"` if [[ $res == *"server"* ]]; then @@ -165,7 +166,7 @@ function sctp_validate() { sleep 1 done done - sudo pkill sctp_server + sudo pkill -9 sctp_server >/dev/null 2>&1 echo $code } @@ -319,5 +320,5 @@ then else echo CLUSTER-2 SCTP [FAILED] fi - +sudo pkill -9 sctp_server >/dev/null 2>&1 exit $code diff --git a/cicd/cluster3/validation.sh b/cicd/cluster3/validation.sh index 5cc82f64..f49af260 100755 --- a/cicd/cluster3/validation.sh +++ b/cicd/cluster3/validation.sh @@ -90,9 +90,9 @@ function tcp_validate() { } function sctp_validate() { - $hexec ep1 ../common/sctp_server server1 & - $hexec ep2 ../common/sctp_server server2 & - $hexec ep3 ../common/sctp_server server3 & + $hexec ep1 ../common/sctp_server ${ep[0]} 8080 server1 >/dev/null 2>&1 & + $hexec ep2 ../common/sctp_server ${ep[1]} 8080 server2 >/dev/null 2>&1 & + $hexec ep3 ../common/sctp_server ${ep[2]} 8080 server3 >/dev/null 2>&1 & sleep 20 @@ -106,7 +106,7 @@ function sctp_validate() { else $hexec r2 ip route list match 20.20.20.1 >&2 echo "BGP Service Route [NOK]" >&2 - sudo pkill sctp_server + sudo pkill sctp_server >/dev/null 2>&1 return 1 fi @@ -116,7 +116,7 @@ function sctp_validate() { waitCount=0 while [ $j -le 2 ] do - res=$($hexec user timeout 10 ../common/sctp_client ${ep[j]} 8080) + res=$($hexec user timeout 10 ../common/sctp_client 1.1.1.1 0 ${ep[j]} 8080) if [[ $res == "${servArr[j]}" ]] then echo "$res UP" >&2 @@ -139,7 +139,7 @@ function sctp_validate() { do for j in {0..2} do - res=$($hexec user timeout 10 ../common/sctp_client 20.20.20.1 2020) + res=$($hexec user timeout 10 ../common/sctp_client 1.1.1.1 0 20.20.20.1 2020) echo -e $res >&2 ids=`echo "${res//[!0-9]/}"` if [[ $res == *"server"* ]]; then @@ -164,7 +164,7 @@ function sctp_validate() { sleep 1 done done - sudo pkill sctp_server + sudo pkill sctp_server >/dev/null 2>&1 echo $code } diff --git a/cicd/common/sctp_client b/cicd/common/sctp_client index 424dcc34..7e1cfcb7 100755 Binary files a/cicd/common/sctp_client and b/cicd/common/sctp_client differ diff --git a/cicd/common/sctp_client.c b/cicd/common/sctp_client.c index 0c4c30cd..ac6c012e 100644 --- a/cicd/common/sctp_client.c +++ b/cicd/common/sctp_client.c @@ -1,96 +1,84 @@ -#include -#include -#include -#include #include #include #include #include #include -#define MAX_BUFFER 1024 -#define MY_PORT_NUM 8080 /* This can be changed to suit the need and should be same in server and client */ +#include +#include +#include +#include +#include + +#define RECVBUFSIZE 4096 +#define PPID 1234 -int -main (int argc, char* argv[]) +int main(int argc, char* argv[]) { - int connSock, in, i, ret, flags; - struct sockaddr_in servaddr; - struct sctp_status status; - struct sctp_sndrcvinfo sndrcvinfo; - char buffer[MAX_BUFFER + 1]; - int datalen = 0; - fd_set read_fd_set; - /*Get the input from user*/ - //printf("Enter data to send: "); - //fgets(buffer, MAX_BUFFER, stdin); - /* Clear the newline or carriage return from the end*/ - //buffer[strcspn(buffer, "\r\n")] = 0; - /* Sample input */ - strncpy (buffer, "Hello Server", 12); - buffer[12] = '\0'; - datalen = strlen(buffer); + struct sockaddr_in servaddr = {0}; + struct sockaddr_in laddr = {0}; + int sockfd, in, flags; + char *saddr; + int sport, lport, error = 0; + struct sctp_status status = {0}; + struct sctp_sndrcvinfo sndrcvinfo = {0}; + struct sctp_event_subscribe events = {0}; + struct sctp_initmsg initmsg = {0}; + char msg[1024] = {0}; + char buff[1024] = {0}; + socklen_t opt_len; + socklen_t slen = (socklen_t) sizeof(struct sockaddr_in); + - connSock = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP); + sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); + lport = atoi(argv[2]); - if (connSock == -1) - { - printf("Socket creation failed\n"); - perror("socket()"); - exit(1); - } + laddr.sin_family = AF_INET; + laddr.sin_addr.s_addr = inet_addr(argv[1]); + laddr.sin_port = lport?htons(lport):0; - bzero ((void *) &servaddr, sizeof (servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons (atoi(argv[2])); - servaddr.sin_addr.s_addr = inet_addr (argv[1]); + //bind to local address + error = bind(sockfd, (struct sockaddr *)&laddr, sizeof(struct sockaddr_in)); + if (error != 0) { + printf("\n\n\t\t***r: error binding addr:" + " %s. ***\n", strerror(errno)); + exit(1); + } - ret = connect (connSock, (struct sockaddr *) &servaddr, sizeof (servaddr)); + //set the association options + initmsg.sinit_num_ostreams = 1; + setsockopt( sockfd, IPPROTO_SCTP, SCTP_INITMSG, &initmsg,sizeof(initmsg)); - if (ret == -1) - { - printf("Connection failed\n"); - perror("connect()"); - close(connSock); - exit(1); - } - FD_ZERO(&read_fd_set); - ret = sctp_sendmsg (connSock, (void *) buffer, (size_t) datalen, - NULL, 0, 0, 0, 0, 0, 0); - if(ret == -1 ) - { - printf("Error in sctp_sendmsg\n"); - perror("sctp_sendmsg()"); - } - else { - // printf("Successfully sent %d bytes data to server\n", ret); - FD_SET(connSock, &read_fd_set); - int ret_val = select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL); - if (ret_val >= 0) { - if (FD_ISSET(connSock, &read_fd_set)) { + saddr = argv[3]; + sport = atoi(argv[4]); + bzero( (void *)&servaddr, sizeof(servaddr) ); + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(sport); + servaddr.sin_addr.s_addr = inet_addr( saddr ); - in = sctp_recvmsg (connSock, buffer, sizeof (buffer), - (struct sockaddr *) NULL, 0, &sndrcvinfo, &flags); - if( in == -1) - { - printf("Error in sctp_recvmsg\n"); - perror("sctp_recvmsg()"); - close(connSock); - return -1; - } - else { - //Add '\0' in case of text data - buffer[in] = '\0'; + connect( sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); - // printf (" Length of Data received: %d\n", in); - printf ("%s", (char *) buffer); - } - } - } - } + opt_len = (socklen_t) sizeof(struct sctp_status); + getsockopt(sockfd, IPPROTO_SCTP, SCTP_STATUS, &status, &opt_len); + + while(1) + { + strncpy (msg, "hello", strlen("hello")); + //printf("Sending msg to server: %s", msg); + sctp_sendmsg(sockfd, (const void *)msg, strlen(msg), NULL, 0,htonl(PPID), 0, 0 , 0, 0); - close (connSock); + in = sctp_recvmsg(sockfd, (void*)buff, RECVBUFSIZE, + (struct sockaddr *)&servaddr, + &slen, &sndrcvinfo, &flags); + if (in > 0 && in < RECVBUFSIZE - 1) + { + buff[in] = 0; + printf("%s",buff); + break; + } + } - return 0; + close(sockfd); + return 0; } diff --git a/cicd/common/sctp_server b/cicd/common/sctp_server index 8f33a49f..a2c022b4 100755 Binary files a/cicd/common/sctp_server and b/cicd/common/sctp_server differ diff --git a/cicd/common/sctp_server.c b/cicd/common/sctp_server.c index 182e20cc..e49eaf33 100644 --- a/cicd/common/sctp_server.c +++ b/cicd/common/sctp_server.c @@ -1,137 +1,126 @@ +#include +#include +#include +#include +#include #include #include #include #include -#include -#include -#include -#include -#include -#define MAX_BUFFER 1024 -#define MY_PORT_NUM 8080 /* This can be changed to suit the need and should be same in server and client */ - -int -main (int argc, char* argv[]) -{ - int listenSock, connSock, ret, in, flags, i; - struct sockaddr_in servaddr; - struct sctp_initmsg initmsg; - struct sctp_event_subscribe events; - struct sctp_sndrcvinfo sndrcvinfo; - char buffer[MAX_BUFFER + 1]; - int count = 0; - fd_set read_fd_set; - - listenSock = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP); - if(listenSock == -1) - { - printf("Failed to create socket\n"); - perror("socket()"); - exit(1); - } - - bzero ((void *) &servaddr, sizeof (servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = htonl (INADDR_ANY); - servaddr.sin_port = htons (MY_PORT_NUM); - - ret = bind (listenSock, (struct sockaddr *) &servaddr, sizeof (servaddr)); - - if(ret == -1 ) - { - printf("Bind failed \n"); - perror("bind()"); - close(listenSock); - exit(1); - } - - /* Specify that a maximum of 5 streams will be available per socket */ - memset (&initmsg, 0, sizeof (initmsg)); - initmsg.sinit_num_ostreams = 5; - initmsg.sinit_max_instreams = 5; - initmsg.sinit_max_attempts = 4; - ret = setsockopt (listenSock, IPPROTO_SCTP, SCTP_INITMSG, - &initmsg, sizeof (initmsg)); - - if(ret == -1 ) - { - printf("setsockopt() failed \n"); - perror("setsockopt()"); - close(listenSock); - exit(1); - } - - ret = listen (listenSock, 5); - if(ret == -1 ) - { - printf("listen() failed \n"); - perror("listen()"); - close(listenSock); - exit(1); - } - - while (1) - { - char buffer[MAX_BUFFER + 1]; - int len; - FD_ZERO(&read_fd_set); - - //Clear the buffer - bzero (buffer, MAX_BUFFER + 1); - - //printf ("Awaiting a new connection\n"); - - connSock = accept (listenSock, (struct sockaddr *) NULL, (int *) NULL); - if (connSock == -1) - { - printf("accept() failed\n"); - perror("accept()"); - close(connSock); - continue; - } - else - //printf ("Server: New client connected to %s\n", argv[1]); - count++; - FD_SET(connSock, &read_fd_set); - int ret_val = select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL); - if (ret_val >= 0) { - if (FD_ISSET(connSock, &read_fd_set)) { - in = sctp_recvmsg (connSock, buffer, sizeof (buffer), - (struct sockaddr *) NULL, 0, &sndrcvinfo, &flags); - - if( in == -1) - { - printf("Server: Error in sctp_recvmsg\n"); - perror("sctp_recvmsg()"); - close(connSock); - continue; - } - else - { - //Add '\0' in case of text data - buffer[in] = '\0'; - //printf (" Length of Data received: %d\n", in); - //printf (" Data : %s\n", (char *) buffer); - strncpy (buffer, argv[1], strlen(argv[1])); - buffer[strlen(argv[1])] = '\0'; - int datalen = strlen(buffer); - - ret = sctp_sendmsg (connSock, (void *) buffer, (size_t) datalen, - NULL, 0, 0, 0, 0, 0, 0); - if(ret == -1 ) - { - printf("Error in sctp_sendmsg\n"); - perror("sctp_sendmsg()"); - } - //else - // printf("Successfully sent %d bytes data to client\n", ret); - } - close (connSock); - if (count == 5) - exit(0); - } - } - } - - return 0; +#include + +#define RECVBUFSIZE 4096 +#define PPID 1234 + +int main(int argc, char* argv[]) { + + struct sockaddr_in laddr[10] = {0}; + int i = 0, error; + struct sockaddr_in caddr = {0}; + int sockfd, n, flags; + struct sctp_sndrcvinfo sinfo = {0}; + struct sctp_event_subscribe event = {0}; + char recvbuff[RECVBUFSIZE + 1] = {0}; + socklen_t clen; + + char *saddr, *saddrs, *msg; + int lport, mlen; + + saddrs = argv[1]; + lport = atoi(argv[2]); + msg = argv[3]; + + mlen = strlen(msg); + + sockfd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); + + setsockopt(sockfd, IPPROTO_SCTP, SCTP_EVENTS, &event,sizeof(struct sctp_event_subscribe)); + + const int enable = 1; + if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) < 0) + perror("setsockopt(SO_REUSEADDR) failed"); + + i = 1; + if (strstr(saddrs, ",")) { + saddr = strtok(saddrs, ",\n"); + laddr[0].sin_family = AF_INET; + laddr[0].sin_port = htons(lport); + laddr[0].sin_addr.s_addr = inet_addr(saddr); + printf("%s\n", saddr); + saddr = strtok(NULL, ",\n"); + while(saddr != NULL) { + printf("%s\n", saddr); + laddr[i].sin_family = AF_INET; + laddr[i].sin_port = htons(lport); + laddr[i].sin_addr.s_addr = inet_addr(saddr); + saddr = strtok(NULL, ",\n"); + i++; + } + } else { + laddr[0].sin_family = AF_INET; + laddr[0].sin_port = htons(lport); + laddr[0].sin_addr.s_addr = inet_addr(saddrs); + } +#if 0 + laddr.sin_family = AF_INET; + laddr.sin_port = htons(lport); + laddr.sin_addr.s_addr = inet_addr(saddr); +#endif + + error = bind(sockfd, (struct sockaddr *)&laddr[0], sizeof(struct sockaddr_in)); + if (error != 0) { + printf("\n\n\t\t***r: error binding addr:" + " %s. ***\n", strerror(errno)); + exit(1); + } + + if (i > 1) { + error = sctp_bindx(sockfd,(struct sockaddr*) &laddr[1], i - 1, SCTP_BINDX_ADD_ADDR); + if (error != 0) { + printf("\n\n\t\t***r: error adding addrs:" + " %s. ***\n", strerror(errno)); + exit(1); + } + } + listen(sockfd, 1); + + while(1) + { + flags = 0; + memset((void *)&caddr, 0, sizeof(struct sockaddr_in)); + clen = (socklen_t)sizeof(struct sockaddr_in); + memset((void *)&sinfo, 0, sizeof(struct sctp_sndrcvinfo)); + + n = sctp_recvmsg(sockfd, (void*)recvbuff, RECVBUFSIZE,(struct sockaddr *)&caddr, &clen, &sinfo, &flags); + if (-1 == n) + { + printf("Error with sctp_recvmsg: %d\n", errno); + perror("Description: "); + printf("Waiting..\n"); + sleep(1); + continue; + } + + if (flags & MSG_NOTIFICATION) + { + printf("Notification received from %s:%u\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port)); + } + else + { + printf("Received from %s:%u on stream %d, PPID %d.: %s\n", + inet_ntoa(caddr.sin_addr), + ntohs(caddr.sin_port), + sinfo.sinfo_stream, + ntohl(sinfo.sinfo_ppid), + recvbuff); + } + + printf("Sending msg to client: %s\n", msg); + sctp_sendmsg(sockfd, (const void *)msg, strlen(msg), (struct sockaddr *)&caddr, clen, htonl(PPID), 0, 0 , 0, 0); + + }//while + + close(sockfd); + return (0); } + diff --git a/cicd/sctpfullnat/validation.sh b/cicd/sctpfullnat/validation.sh index 0f52a1c5..64398307 100755 --- a/cicd/sctpfullnat/validation.sh +++ b/cicd/sctpfullnat/validation.sh @@ -1,18 +1,19 @@ #!/bin/bash source ../common.sh echo SCENARIO-SCTP-FULLNAT -$hexec ep1 ./server server1 & -$hexec ep2 ./server server2 & +servArr=( "server1" "server2" ) +ep=( "10.0.3.10" "10.0.3.11" ) + +$hexec ep1 ../common/sctp_server ${ep[0]} 38412 server1 >/dev/null 2>&1 & +$hexec ep2 ../common/sctp_server ${ep[1]} 38412 server2 >/dev/null 2>&1 & sleep 5 code=0 -servArr=( "server1" "server2" ) -ep=( "10.0.3.10" "10.0.3.11" ) j=0 waitCount=0 while [ $j -le 1 ] do - res=$($hexec c1 ./client ${ep[j]} 38412) + res=$($hexec c1 ../common/sctp_client 10.0.3.71 0 ${ep[j]} 38412) #echo $res if [[ $res == "${servArr[j]}" ]] then @@ -25,6 +26,7 @@ do then echo "All Servers are not UP" echo SCENARIO-SCTP-FULLNAT [FAILED] + sudo pkill -9 -x sctp_server >/dev/null 2>&1 exit 1 fi @@ -36,7 +38,7 @@ for i in {1..4} do for j in {0..1} do - res=$($hexec c1 ./client 20.20.20.1 38412) + res=$($hexec c1 ../common/sctp_client 10.0.3.71 0 20.20.20.1 38412) echo -e $res if [[ $res != "${servArr[j]}" ]] then @@ -51,6 +53,6 @@ then else echo SCENARIO-SCTP-FULLNAT [FAILED] fi -sudo pkill -9 -x server >/dev/null 2>&1 +sudo pkill -9 -x sctp_server >/dev/null 2>&1 exit $code diff --git a/cicd/sctpfullnatl2/config.sh b/cicd/sctpfullnatl2/config.sh index ab6968f8..7a119525 100755 --- a/cicd/sctpfullnatl2/config.sh +++ b/cicd/sctpfullnatl2/config.sh @@ -37,6 +37,6 @@ create_docker_host_cnbridge --host1 br1 --host2 c1 ##Create LB rule $dexec llb1 loxicmd create lb 10.2.100.85 --sctp=38412:38412 --endpoints=10.2.96.58:1,10.2.89.253:1 --mode=fullnat -#$dexec llb1 bash -c 'for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > "$i"; done' +$dexec llb1 bash -c 'for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > "$i"; done' sleep 10 diff --git a/cicd/sctpfullnatl2/validation.sh b/cicd/sctpfullnatl2/validation.sh index 8226881c..6ddbfa7b 100755 --- a/cicd/sctpfullnatl2/validation.sh +++ b/cicd/sctpfullnatl2/validation.sh @@ -1,18 +1,18 @@ #!/bin/bash source ../common.sh echo SCENARIO-SCTP-FULLNAT -$hexec ep1 ./server server1 & -$hexec ep2 ./server server2 & +servArr=( "server1" "server2" ) +ep=( "10.2.96.58" "10.2.89.253" ) +$hexec ep1 ../common/sctp_server ${ep[0]} 38412 server1 >/dev/null 2>&1 & +$hexec ep2 ../common/sctp_server ${ep[1]} 38412 server2 >/dev/null 2>&1 & sleep 5 code=0 -servArr=( "server1" "server2" ) -ep=( "10.2.96.58" "10.2.89.253" ) j=0 waitCount=0 while [ $j -le 1 ] do - res=$($hexec c1 ./client ${ep[j]} 38412) + res=$($hexec c1 ../common/sctp_client 10.2.9.19 0 ${ep[j]} 38412) #echo $res if [[ $res == "${servArr[j]}" ]] then @@ -25,6 +25,7 @@ do then echo "All Servers are not UP" echo SCENARIO-SCTP-FULLNAT [FAILED] + sudo pkill -9 -x sctp_server >/dev/null 2>&1 exit 1 fi @@ -36,7 +37,7 @@ for i in {1..4} do for j in {0..1} do - res=$($hexec c1 ./client 10.2.100.85 38412) + res=$($hexec c1 ../common/sctp_client 10.2.9.19 0 10.2.100.85 38412) echo -e $res if [[ $res != "${servArr[j]}" ]] then @@ -51,6 +52,6 @@ then else echo SCENARIO-SCTP-FULLNAT [FAILED] fi -sudo pkill -9 -x server >/dev/null 2>&1 +sudo pkill -9 -x sctp_server >/dev/null 2>&1 exit $code diff --git a/cicd/sctplb/validation.sh b/cicd/sctplb/validation.sh index ad30c8ab..2d36c99d 100755 --- a/cicd/sctplb/validation.sh +++ b/cicd/sctplb/validation.sh @@ -1,19 +1,21 @@ #!/bin/bash source ../common.sh echo SCENARIO-sctplb -$hexec l3ep1 ../common/sctp_server server1 & -$hexec l3ep2 ../common/sctp_server server2 & -$hexec l3ep3 ../common/sctp_server server3 & -sleep 5 -code=0 servArr=( "server1" "server2" "server3" ) ep=( "31.31.31.1" "32.32.32.1" "33.33.33.1" ) + +$hexec l3ep1 ../common/sctp_server ${ep[0]} 8080 server1 >/dev/null 2>&1 & +$hexec l3ep2 ../common/sctp_server ${ep[1]} 8080 server2 >/dev/null 2>&1 & +$hexec l3ep3 ../common/sctp_server ${ep[2]} 8080 server3 >/dev/null 2>&1 & + +sleep 5 +code=0 j=0 waitCount=0 while [ $j -le 2 ] do - res=$($hexec l3h1 timeout 10 ../common/sctp_client ${ep[j]} 8080) + res=$($hexec l3h1 timeout 10 ../common/sctp_client 10.10.10.1 0 ${ep[j]} 8080) #echo $res if [[ $res == "${servArr[j]}" ]] then @@ -26,6 +28,7 @@ do then echo "All Servers are not UP" echo SCENARIO-sctplb [FAILED] + sudo pkill sctp_server >/dev/null 2>&1 exit 1 fi @@ -37,7 +40,7 @@ for i in {1..4} do for j in {0..2} do - res=$($hexec l3h1 timeout 10 ../common/sctp_client 20.20.20.1 2020) + res=$($hexec l3h1 timeout 10 ../common/sctp_client 10.10.10.1 0 20.20.20.1 2020) echo -e $res if [[ $res != "${servArr[j]}" ]] then @@ -46,7 +49,7 @@ do sleep 1 done done -sudo pkill sctp_server +sudo pkill sctp_server >/dev/null 2>&1 if [[ $code == 0 ]] then echo SCENARIO-sctplb [OK] diff --git a/cicd/sctplbdsr/config.sh b/cicd/sctplbdsr/config.sh index bccd603c..fabffd27 100755 --- a/cicd/sctplbdsr/config.sh +++ b/cicd/sctplbdsr/config.sh @@ -67,4 +67,4 @@ $hexec l3h1 sysctl net.ipv4.conf.all.rp_filter=0 2>&1 >> /dev/null $hexec l3h1 sysctl net.ipv4.conf.vlan11.rp_filter=0 2>&1 >> /dev/null sleep 5 -$dexec llb1 loxicmd create lb 20.20.20.1 --sctp=2020:2020 --endpoints=31.31.31.1:1,32.32.32.1:1,33.33.33.1:1 --mode=dsr +$dexec llb1 loxicmd create lb --select=hash 20.20.20.1 --sctp=2020:2020 --endpoints=31.31.31.1:1,32.32.32.1:1,33.33.33.1:1 --mode=dsr diff --git a/cicd/sctplbdsr/sctp_server b/cicd/sctplbdsr/sctp_server deleted file mode 100755 index 4406c64e..00000000 Binary files a/cicd/sctplbdsr/sctp_server and /dev/null differ diff --git a/cicd/sctplbdsr/validation.sh b/cicd/sctplbdsr/validation.sh index 18cf5b0e..88825917 100755 --- a/cicd/sctplbdsr/validation.sh +++ b/cicd/sctplbdsr/validation.sh @@ -5,20 +5,21 @@ echo SCENARIO-sctplbdsr #$hexec l3ep2 socat -v -T0.5 sctp-l:2020,reuseaddr,fork system:"echo 'server2'; cat" >/dev/null 2>&1 & #$hexec l3ep3 socat -v -T0.5 sctp-l:2020,reuseaddr,fork system:"echo 'server3'; cat" >/dev/null 2>&1 & -$hexec l3ep1 ./sctp_server server1 & -$hexec l3ep2 ./sctp_server server2 & -$hexec l3ep3 ./sctp_server server3 & +servArr=( "server1" "server2" "server3" ) +ep=( "31.31.31.1" "32.32.32.1" "33.33.33.1" ) + +$hexec l3ep1 ../common/sctp_server 20.20.20.1,31.31.31.1 2020 server1 >/dev/null 2>&1 & +$hexec l3ep2 ../common/sctp_server 20.20.20.1,32.32.32.1 2020 server2 >/dev/null 2>&1 & +$hexec l3ep3 ../common/sctp_server 20.20.20.1,33.33.33.1 2020 server3 >/dev/null 2>&1 & sleep 5 code=0 -servArr=( "server1" "server2" "server3" ) -ep=( "31.31.31.1" "32.32.32.1" "33.33.33.1" ) j=0 waitCount=0 while [ $j -le 2 ] do #res=$($hexec l3h1 socat -T10 - SCTP:${ep[j]}:2020) - res=$($hexec l3h1 timeout 10 ../common/sctp_client ${ep[j]} 2020) + res=$($hexec l3h1 timeout 10 ../common/sctp_client 10.10.10.1 2010 ${ep[j]} 2020) echo $res if [[ $res == "${servArr[j]}" ]] then @@ -31,37 +32,32 @@ do then echo "All Servers are not UP" echo SCENARIO-sctplbdsr [FAILED] + sudo pkill -9 sctp_server > /dev/null 2>&1 exit 1 fi fi sleep 1 done -# sudo killall -9 socat +#sudo killall -9 sctp_server >/dev/null 2>&1 + +#$hexec l3ep1 ../common/sctp_server 20.20.20.1 2020 server1 >/dev/null 2>&1 & +#$hexec l3ep2 ../common/sctp_server 20.20.20.1 2020 server2 >/dev/null 2>&1 & +#$hexec l3ep3 ../common/sctp_server 20.20.20.1 2020 server3 >/dev/null 2>&1 & + sleep 5 nid=0 for j in {0..2} do - res=$($hexec l3h1 timeout 10 ../common/sctp_client 20.20.20.1 2020) + res=$($hexec l3h1 timeout 10 ../common/sctp_client 10.10.10.1 2010 20.20.20.1 2020) echo $res - ds=`echo "${res//[!0-9]/}"` - if [[ $res == *"server"* ]]; then - ids=`echo "${res//[!0-9]/}"` - if [[ $nid == 0 ]];then - nid=$((($ids + 1)%4)) - if [[ $nid == 0 ]];then - nid=1 - fi - elif [[ $nid != $((ids)) ]]; then - echo "Expected server$nid got server$((ids))" - code=1 - fi - nid=$((($ids + 1)%4)) - if [[ $nid == 0 ]];then - nid=1 - fi - else + if [[ $exp == "" ]] + then + exp=$res + fi + if [[ $exp != $res ]] + then code=1 fi sleep 1 @@ -74,6 +70,5 @@ else fi #sudo killall -9 socat >> /dev/null 2>&1 -sudo killall -9 sctp_server >> /dev/null 2>&1 - +sudo pkill -9 sctp_server >/dev/null 2>&1 exit $code diff --git a/cicd/sctptunlb/validation.sh b/cicd/sctptunlb/validation.sh index 0545a7a4..0004920e 100755 --- a/cicd/sctptunlb/validation.sh +++ b/cicd/sctptunlb/validation.sh @@ -1,20 +1,22 @@ #!/bin/bash source ../common.sh echo SCENARIO-sctptunlb -$hexec l3e1 ./server server1 & -$hexec l3e2 ./server server2 & -$hexec l3e3 ./server server3 & +servArr=( "server1" "server2" "server3" ) +ep=( "25.25.25.1" "26.26.26.1" "27.27.27.1" ) +ueIP=( "" "32.32.32.1" "31.31.31.1" ) + +$hexec l3e1 ../common/sctp_server ${ep[0]} 8080 server1 >/dev/null 2>&1 & +$hexec l3e2 ../common/sctp_server ${ep[1]} 8080 server2 >/dev/null 2>&1 & +$hexec l3e3 ../common/sctp_server ${ep[2]} 8080 server3 >/dev/null 2>&1 & sleep 5 code=0 -servArr=( "server1" "server2" "server3" ) -ep=( "25.25.25.1" "26.26.26.1" "27.27.27.1" ) j=0 waitCount=0 while [ $j -le 2 ] do #res=$($hexec ue1 curl ${ep[j]}:8080) - res=`$hexec h1 ./client ${ep[j]} 8080` + res=`$hexec h1 ../common/sctp_client 32.32.32.1 0 ${ep[j]} 8080` #echo $res if [[ $res == "${servArr[j]}" ]] then @@ -27,6 +29,7 @@ do then echo "All Servers are not UP" echo SCENARIO-sctptunlb [FAILED] + sudo pkill sctp_server >/dev/null 2>&1 exit 1 fi @@ -40,7 +43,7 @@ for i in {1..2} do for j in {0..2} do - res=$($hexec h$k ./client 88.88.88.88 2020) + res=$($hexec h$k ../common/sctp_client ${ueIP[k]} 0 88.88.88.88 2020) echo -e $res if [[ $res != "${servArr[j]}" ]] then @@ -66,5 +69,6 @@ then else echo SCENARIO-sctptunlb [FAILED] fi +sudo pkill sctp_server >/dev/null 2>&1 exit $code diff --git a/cicd/tcplbdsr1/config.sh b/cicd/tcplbdsr1/config.sh index 8c407510..136b04e3 100755 --- a/cicd/tcplbdsr1/config.sh +++ b/cicd/tcplbdsr1/config.sh @@ -39,4 +39,4 @@ $hexec l3ep2 ip addr add 20.20.20.1/32 dev lo $hexec l3ep3 ip addr add 20.20.20.1/32 dev lo sleep 5 -$dexec llb1 loxicmd create lb 20.20.20.1 --tcp=2020:2020 --endpoints=31.31.31.1:1,32.32.32.1:1,33.33.33.1:1 --mode=dsr +$dexec llb1 loxicmd create lb 20.20.20.1 --select=hash --tcp=2020:2020 --endpoints=31.31.31.1:1,32.32.32.1:1,33.33.33.1:1 --mode=dsr diff --git a/cicd/tcplbdsr1/validation.sh b/cicd/tcplbdsr1/validation.sh index 6b39f22c..75afb0eb 100755 --- a/cicd/tcplbdsr1/validation.sh +++ b/cicd/tcplbdsr1/validation.sh @@ -34,11 +34,15 @@ done for j in {0..2} do - res=$($hexec l3h1 socat -T10 - TCP:20.20.20.1:2020) + res=$($hexec l3h1 socat -T10 - TCP:20.20.20.1:2020,sp=55001,reuseaddr) echo $res - if [[ $res != "${servArr[j]}" ]] + if [[ $exp == "" ]] then - code=1 + exp=$res + fi + if [[ $exp != $res ]] + then + code=1 fi sleep 1 done diff --git a/cicd/tcplbdsr2/config.sh b/cicd/tcplbdsr2/config.sh index 4a2bdf05..990f96fd 100755 --- a/cicd/tcplbdsr2/config.sh +++ b/cicd/tcplbdsr2/config.sh @@ -67,4 +67,4 @@ $hexec l3h1 sysctl net.ipv4.conf.all.rp_filter=0 2>&1 >> /dev/null $hexec l3h1 sysctl net.ipv4.conf.vlan11.rp_filter=0 2>&1 >> /dev/null sleep 5 -$dexec llb1 loxicmd create lb 20.20.20.1 --tcp=2020:2020 --endpoints=31.31.31.1:1,32.32.32.1:1,33.33.33.1:1 --mode=dsr +$dexec llb1 loxicmd create lb 20.20.20.1 --select=hash --tcp=2020:2020 --endpoints=31.31.31.1:1,32.32.32.1:1,33.33.33.1:1 --mode=dsr diff --git a/cicd/tcplbdsr2/validation.sh b/cicd/tcplbdsr2/validation.sh index bb5e1324..42d77c38 100755 --- a/cicd/tcplbdsr2/validation.sh +++ b/cicd/tcplbdsr2/validation.sh @@ -34,11 +34,15 @@ done for j in {0..2} do - res=$($hexec l3h1 socat -T10 - TCP:20.20.20.1:2020) + res=$($hexec l3h1 socat -T10 - TCP:20.20.20.1:2020,sp=55001,reuseaddr) echo $res - if [[ $res != "${servArr[j]}" ]] + if [[ $exp == "" ]] then - code=1 + exp=$res + fi + if [[ $exp != $res ]] + then + code=1 fi sleep 1 done diff --git a/cicd/ulclsctplb/client b/cicd/ulclsctplb/client deleted file mode 100755 index 424dcc34..00000000 Binary files a/cicd/ulclsctplb/client and /dev/null differ diff --git a/cicd/ulclsctplb/client.c b/cicd/ulclsctplb/client.c deleted file mode 100644 index 0c4c30cd..00000000 --- a/cicd/ulclsctplb/client.c +++ /dev/null @@ -1,96 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define MAX_BUFFER 1024 -#define MY_PORT_NUM 8080 /* This can be changed to suit the need and should be same in server and client */ - -int -main (int argc, char* argv[]) -{ - int connSock, in, i, ret, flags; - struct sockaddr_in servaddr; - struct sctp_status status; - struct sctp_sndrcvinfo sndrcvinfo; - char buffer[MAX_BUFFER + 1]; - int datalen = 0; - fd_set read_fd_set; - - /*Get the input from user*/ - //printf("Enter data to send: "); - //fgets(buffer, MAX_BUFFER, stdin); - /* Clear the newline or carriage return from the end*/ - //buffer[strcspn(buffer, "\r\n")] = 0; - /* Sample input */ - strncpy (buffer, "Hello Server", 12); - buffer[12] = '\0'; - datalen = strlen(buffer); - - connSock = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP); - - if (connSock == -1) - { - printf("Socket creation failed\n"); - perror("socket()"); - exit(1); - } - - bzero ((void *) &servaddr, sizeof (servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons (atoi(argv[2])); - servaddr.sin_addr.s_addr = inet_addr (argv[1]); - - ret = connect (connSock, (struct sockaddr *) &servaddr, sizeof (servaddr)); - - if (ret == -1) - { - printf("Connection failed\n"); - perror("connect()"); - close(connSock); - exit(1); - } - FD_ZERO(&read_fd_set); - ret = sctp_sendmsg (connSock, (void *) buffer, (size_t) datalen, - NULL, 0, 0, 0, 0, 0, 0); - if(ret == -1 ) - { - printf("Error in sctp_sendmsg\n"); - perror("sctp_sendmsg()"); - } - else { - // printf("Successfully sent %d bytes data to server\n", ret); - FD_SET(connSock, &read_fd_set); - int ret_val = select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL); - if (ret_val >= 0) { - if (FD_ISSET(connSock, &read_fd_set)) { - - in = sctp_recvmsg (connSock, buffer, sizeof (buffer), - (struct sockaddr *) NULL, 0, &sndrcvinfo, &flags); - - if( in == -1) - { - printf("Error in sctp_recvmsg\n"); - perror("sctp_recvmsg()"); - close(connSock); - return -1; - } - else { - //Add '\0' in case of text data - buffer[in] = '\0'; - - // printf (" Length of Data received: %d\n", in); - printf ("%s", (char *) buffer); - } - } - } - } - - close (connSock); - - return 0; -} diff --git a/cicd/ulclsctplb/server b/cicd/ulclsctplb/server deleted file mode 100755 index 8f33a49f..00000000 Binary files a/cicd/ulclsctplb/server and /dev/null differ diff --git a/cicd/ulclsctplb/server.c b/cicd/ulclsctplb/server.c deleted file mode 100644 index 182e20cc..00000000 --- a/cicd/ulclsctplb/server.c +++ /dev/null @@ -1,137 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define MAX_BUFFER 1024 -#define MY_PORT_NUM 8080 /* This can be changed to suit the need and should be same in server and client */ - -int -main (int argc, char* argv[]) -{ - int listenSock, connSock, ret, in, flags, i; - struct sockaddr_in servaddr; - struct sctp_initmsg initmsg; - struct sctp_event_subscribe events; - struct sctp_sndrcvinfo sndrcvinfo; - char buffer[MAX_BUFFER + 1]; - int count = 0; - fd_set read_fd_set; - - listenSock = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP); - if(listenSock == -1) - { - printf("Failed to create socket\n"); - perror("socket()"); - exit(1); - } - - bzero ((void *) &servaddr, sizeof (servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = htonl (INADDR_ANY); - servaddr.sin_port = htons (MY_PORT_NUM); - - ret = bind (listenSock, (struct sockaddr *) &servaddr, sizeof (servaddr)); - - if(ret == -1 ) - { - printf("Bind failed \n"); - perror("bind()"); - close(listenSock); - exit(1); - } - - /* Specify that a maximum of 5 streams will be available per socket */ - memset (&initmsg, 0, sizeof (initmsg)); - initmsg.sinit_num_ostreams = 5; - initmsg.sinit_max_instreams = 5; - initmsg.sinit_max_attempts = 4; - ret = setsockopt (listenSock, IPPROTO_SCTP, SCTP_INITMSG, - &initmsg, sizeof (initmsg)); - - if(ret == -1 ) - { - printf("setsockopt() failed \n"); - perror("setsockopt()"); - close(listenSock); - exit(1); - } - - ret = listen (listenSock, 5); - if(ret == -1 ) - { - printf("listen() failed \n"); - perror("listen()"); - close(listenSock); - exit(1); - } - - while (1) - { - char buffer[MAX_BUFFER + 1]; - int len; - FD_ZERO(&read_fd_set); - - //Clear the buffer - bzero (buffer, MAX_BUFFER + 1); - - //printf ("Awaiting a new connection\n"); - - connSock = accept (listenSock, (struct sockaddr *) NULL, (int *) NULL); - if (connSock == -1) - { - printf("accept() failed\n"); - perror("accept()"); - close(connSock); - continue; - } - else - //printf ("Server: New client connected to %s\n", argv[1]); - count++; - FD_SET(connSock, &read_fd_set); - int ret_val = select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL); - if (ret_val >= 0) { - if (FD_ISSET(connSock, &read_fd_set)) { - in = sctp_recvmsg (connSock, buffer, sizeof (buffer), - (struct sockaddr *) NULL, 0, &sndrcvinfo, &flags); - - if( in == -1) - { - printf("Server: Error in sctp_recvmsg\n"); - perror("sctp_recvmsg()"); - close(connSock); - continue; - } - else - { - //Add '\0' in case of text data - buffer[in] = '\0'; - //printf (" Length of Data received: %d\n", in); - //printf (" Data : %s\n", (char *) buffer); - strncpy (buffer, argv[1], strlen(argv[1])); - buffer[strlen(argv[1])] = '\0'; - int datalen = strlen(buffer); - - ret = sctp_sendmsg (connSock, (void *) buffer, (size_t) datalen, - NULL, 0, 0, 0, 0, 0, 0); - if(ret == -1 ) - { - printf("Error in sctp_sendmsg\n"); - perror("sctp_sendmsg()"); - } - //else - // printf("Successfully sent %d bytes data to client\n", ret); - } - close (connSock); - if (count == 5) - exit(0); - } - } - } - - return 0; -} diff --git a/cicd/ulclsctplb/validation.sh b/cicd/ulclsctplb/validation.sh index e83c26ae..aca94809 100755 --- a/cicd/ulclsctplb/validation.sh +++ b/cicd/ulclsctplb/validation.sh @@ -1,21 +1,23 @@ #!/bin/bash source ../common.sh echo SCENARIO-ulclsctplb -$hexec l3e1 ./server server1 & -$hexec l3e2 ./server server2 & -$hexec l3e3 ./server server3 & +$hexec l3e1 nohup ../common/sctp_server 25.25.25.1 8080 server1 >/dev/null 2>&1 & +$hexec l3e2 nohup ../common/sctp_server 26.26.26.1 8080 server2 >/dev/null 2>&1 & +$hexec l3e3 nohup ../common/sctp_server 27.27.27.1 8080 server3 >/dev/null 2>&1 & sleep 5 code=0 servArr=( "server1" "server2" "server3" ) ep=( "25.25.25.1" "26.26.26.1" "27.27.27.1" ) +ueIp=( "" "32.32.32.1" "31.31.31.1" ) j=0 waitCount=0 while [ $j -le 2 ] do #res=$($hexec ue1 curl ${ep[j]}:8080) - res=`$hexec ue1 ./client ${ep[j]} 8080` - #echo $res + #res=`$hexec ue1 socat -T10 - SCTP:${ep[j]}:8080,bind=${ueIp[1]}` + res=`$hexec ue1 ../common/sctp_client ${ueIp[1]} 0 ${ep[j]} 8080` + echo $res if [[ $res == "${servArr[j]}" ]] then echo "$res UP" @@ -27,6 +29,7 @@ do then echo "All Servers are not UP" echo SCENARIO-ulclsctplb [FAILED] + sudo pkill -9 sctp_server >/dev/null 2>&1 exit 1 fi @@ -40,7 +43,8 @@ for i in {1..2} do for j in {0..2} do - res=$($hexec ue$k ./client 88.88.88.88 2020) + res=$($hexec ue$k ../common/sctp_client ${ueIp[k]} 0 88.88.88.88 2020) + #res=$($hexec ue$k socat -T10 - SCTP:88.88.88.88:2020,bind=${ueIp[k]}) echo -e $res if [[ $res != "${servArr[j]}" ]] then @@ -66,5 +70,5 @@ then else echo SCENARIO-ulclsctplb [FAILED] fi +sudo pkill -9 sctp_server >/dev/null 2>&1 exit $code - diff --git a/loxilb-ebpf b/loxilb-ebpf index b1e5574d..ef0a38cb 160000 --- a/loxilb-ebpf +++ b/loxilb-ebpf @@ -1 +1 @@ -Subproject commit b1e5574dd61266caa560d1e7e6205ab90d05a7ee +Subproject commit ef0a38cbcafd3f9febec0d2a3933ec6a728e7588 diff --git a/loxinet/dpebpf_linux.go b/loxinet/dpebpf_linux.go index a411b54f..21e5dffd 100644 --- a/loxinet/dpebpf_linux.go +++ b/loxinet/dpebpf_linux.go @@ -171,7 +171,10 @@ func dpEbpfTicker() { C.llb_collect_map_stats(C.int(tbls[sel])) // Age any entries related to Conntrack - C.llb_collect_map_stats(C.int(C.LL_DP_CT_STATS_MAP)) + /* No need to fetch all stats in this fashion */ + //C.llb_collect_map_stats(C.int(C.LL_DP_CT_STATS_MAP)) + + /* Per entry stats will be fetched in C.ll_ct_map_ent_has_aged */ C.llb_age_map_entries(C.LL_DP_CT_MAP) C.llb_age_map_entries(C.LL_DP_FCV4_MAP)