Skip to content

Commit ef38a03

Browse files
Merge pull request #643 from nik-netlox/main
Misc: changes related to SCTP MH
2 parents 7d9fb77 + 6092e11 commit ef38a03

18 files changed

+659
-25
lines changed

cicd/common/sctp_client

7.81 KB
Binary file not shown.

cicd/common/sctp_client.c

+75-13
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ int main(int argc, char* argv[])
1616
{
1717

1818
struct sockaddr_in servaddr = {0};
19-
struct sockaddr_in laddr = {0};
20-
int sockfd, in, flags;
21-
char *saddr;
22-
int sport, lport, error = 0, secs = 0;
19+
struct sockaddr_in laddr[10] = {0};
20+
int sockfd, in, flags, count = 1;
21+
char *saddr, *laddrs, *addr;
22+
int sport, lport, error = 0, secs = 0, i = 0;
2323
struct sctp_status status = {0};
2424
struct sctp_sndrcvinfo sndrcvinfo = {0};
2525
struct sctp_event_subscribe events = {0};
@@ -29,13 +29,35 @@ int main(int argc, char* argv[])
2929
socklen_t opt_len;
3030
socklen_t slen = (socklen_t) sizeof(struct sockaddr_in);
3131

32-
32+
if (argc < 5) {
33+
printf("Usage: %s localaddr1<,localaddr2..> localport serverIP serverport <delay> <count>\n", argv[0]);
34+
exit(1);
35+
}
3336
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
3437
lport = atoi(argv[2]);
35-
36-
laddr.sin_family = AF_INET;
37-
laddr.sin_addr.s_addr = inet_addr(argv[1]);
38-
laddr.sin_port = lport?htons(lport):0;
38+
laddrs = argv[1];
39+
memset(laddr, 0, sizeof(laddr));
40+
if (strstr(laddrs, ",")) {
41+
i = 0;
42+
addr = strtok(laddrs, ",\n");
43+
laddr[0].sin_family = AF_INET;
44+
laddr[0].sin_port = lport?htons(lport):0;
45+
laddr[0].sin_addr.s_addr = inet_addr(addr);
46+
//printf("%s\n", addr);
47+
addr = strtok(NULL, ",\n");
48+
while(addr != NULL) {
49+
i++;
50+
//printf("%s\n", addr);
51+
laddr[i].sin_family = AF_INET;
52+
laddr[i].sin_port = lport?htons(lport):0;
53+
laddr[i].sin_addr.s_addr = inet_addr(addr);
54+
addr = strtok(NULL, ",\n");
55+
}
56+
} else {
57+
laddr[0].sin_family = AF_INET;
58+
laddr[0].sin_addr.s_addr = inet_addr(argv[1]);
59+
laddr[0].sin_port = lport?htons(lport):0;
60+
}
3961

4062
//bind to local address
4163
error = bind(sockfd, (struct sockaddr *)&laddr, sizeof(struct sockaddr_in));
@@ -45,15 +67,31 @@ int main(int argc, char* argv[])
4567
exit(1);
4668
}
4769

70+
int j = 1;
71+
while(j <= i) {
72+
error = sctp_bindx(sockfd,(struct sockaddr*) &laddr[j], j, SCTP_BINDX_ADD_ADDR);
73+
if (error != 0) {
74+
printf("\n\n\t\t***r: error adding addrs:"
75+
" %s. ***\n", strerror(errno));
76+
exit(1);
77+
} else {
78+
//printf("Bind OK\n");
79+
}
80+
j++;
81+
}
82+
4883
//set the association options
4984
initmsg.sinit_num_ostreams = 1;
5085
setsockopt( sockfd, IPPROTO_SCTP, SCTP_INITMSG, &initmsg,sizeof(initmsg));
5186

5287
saddr = argv[3];
5388
sport = atoi(argv[4]);
54-
if (argv[5]) {
89+
if (argc >=6 ) { /* Delay before exit */
5590
secs = atoi(argv[5]);
5691
}
92+
if (argc == 7) { /* count for sending 1pps*/
93+
count = atoi(argv[6]);
94+
}
5795
bzero( (void *)&servaddr, sizeof(servaddr) );
5896
servaddr.sin_family = AF_INET;
5997
servaddr.sin_port = htons(sport);
@@ -65,11 +103,25 @@ int main(int argc, char* argv[])
65103
opt_len = (socklen_t) sizeof(struct sctp_status);
66104
getsockopt(sockfd, IPPROTO_SCTP, SCTP_STATUS, &status, &opt_len);
67105

68-
while(1)
106+
fd_set fds; // will be checked for being ready to read
107+
FD_ZERO(&fds);
108+
FD_SET(sockfd, &fds);
109+
struct timeval tv = { 0 };
110+
tv.tv_sec = 1;
111+
tv.tv_usec = 0;
112+
113+
while(count)
69114
{
70115
strncpy (msg, "hello", strlen("hello"));
71-
//printf("Sending msg to server: %s", msg);
72116
sctp_sendmsg(sockfd, (const void *)msg, strlen(msg), NULL, 0,htonl(PPID), 0, 0 , 0, 0);
117+
//printf("Sending msg to server: %s", msg);
118+
//
119+
int ret = select( sockfd + 1, &fds, NULL, NULL, &tv );
120+
if (ret <= 0) {
121+
printf("Timeout\n");
122+
count--;
123+
sleep(1);
124+
} else if (FD_ISSET( sockfd, &fds )) {
73125

74126
in = sctp_recvmsg(sockfd, (void*)buff, RECVBUFSIZE,
75127
(struct sockaddr *)&servaddr,
@@ -79,7 +131,17 @@ int main(int argc, char* argv[])
79131
buff[in] = 0;
80132
printf("%s",buff);
81133
fflush(stdout);
82-
break;
134+
count--;
135+
if(!count)
136+
break;
137+
else {
138+
printf("\n");
139+
fflush(stdout);
140+
sleep(1);
141+
}
142+
}
143+
} else {
144+
break;
83145
}
84146
}
85147
if(secs) sleep(secs);

cicd/common/sctp_server

0 Bytes
Binary file not shown.

cicd/common/sctp_server.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,14 @@ int main(int argc, char* argv[]) {
4444
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) < 0)
4545
perror("setsockopt(SO_REUSEADDR) failed");
4646

47-
i = 1;
4847
if (strstr(saddrs, ",")) {
4948
saddr = strtok(saddrs, ",\n");
5049
laddr[0].sin_family = AF_INET;
5150
laddr[0].sin_port = htons(lport);
5251
laddr[0].sin_addr.s_addr = inet_addr(saddr);
5352
printf("%s\n", saddr);
5453
saddr = strtok(NULL, ",\n");
54+
i = 1;
5555
while(saddr != NULL) {
5656
printf("%s\n", saddr);
5757
laddr[i].sin_family = AF_INET;
@@ -77,14 +77,15 @@ int main(int argc, char* argv[]) {
7777
" %s. ***\n", strerror(errno));
7878
exit(1);
7979
}
80-
81-
if (i > 1) {
82-
error = sctp_bindx(sockfd,(struct sockaddr*) &laddr[1], i - 1, SCTP_BINDX_ADD_ADDR);
80+
int j = 1;
81+
while(j <= i) {
82+
error = sctp_bindx(sockfd,(struct sockaddr*) &laddr[j], j - 1, SCTP_BINDX_ADD_ADDR);
8383
if (error != 0) {
8484
printf("\n\n\t\t***r: error adding addrs:"
8585
" %s. ***\n", strerror(errno));
8686
exit(1);
8787
}
88+
j++;
8889
}
8990
listen(sockfd, 1);
9091

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
name: sctp-pod-01
5+
labels:
6+
app: sctp-pod-01
7+
annotations:
8+
k8s.v1.cni.cncf.io/networks: '[{
9+
"name": "macvlan1",
10+
"default-route": ["4.0.6.149"]
11+
}]'
12+
spec:
13+
containers:
14+
- name: sctp-test
15+
image: loxilbio/sctp-darn:latest
16+
imagePullPolicy: Always
17+
#command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 6 ; done"]
18+
command: ["sctp_darn","-H", "0.0.0.0","-P", "9999", "-l"]
19+
ports:
20+
- containerPort: 9999
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: multus-sctp-service
5+
annotations:
6+
loxilb.io/num-secondary-networks: "2"
7+
loxilb.io/multus-nets: macvlan1,macvlan2
8+
loxilb.io/lbmode: "fullnat"
9+
spec:
10+
externalTrafficPolicy: Local
11+
loadBalancerClass: loxilb.io/loxilb
12+
selector:
13+
app: sctp-pod-01
14+
ports:
15+
- port: 55002
16+
protocol: SCTP
17+
targetPort: 9999
18+
type: LoadBalancer

cicd/k3s-sctpmh/config.sh

+5-1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ $hexec r1 ip route add 20.20.20.1/32 via 11.11.11.11
101101
# Route back to user
102102
sudo ip route add 11.11.11.0/24 via 14.14.14.1
103103
sudo ip route add 123.123.123.0/24 via 14.14.14.1
104+
sudo ip route add 124.124.124.0/24 via 14.14.14.1
105+
sudo ip route add 125.125.125.0/24 via 14.14.14.1
104106

105107
# Change default route in llb1
106108
$hexec llb1 ip route del default
@@ -132,7 +134,9 @@ else
132134
echo "Start K3s installation"
133135

134136
# Install k3s without external cloud-manager and disabled servicelb
135-
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.22.9+k3s1 INSTALL_K3S_EXEC="server --disable traefik --disable servicelb --disable-cloud-controller --kubelet-arg cloud-provider=external" K3S_KUBECONFIG_MODE="644" sh -
137+
sudo apt install ipset ipvsadm
138+
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable traefik,metrics-server,servicelb" K3S_KUBECONFIG_MODE="644" sh -s - server --kube-proxy-arg proxy-mode=ipvs
139+
#curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.22.9+k3s1 INSTALL_K3S_EXEC="server --disable traefik --disable servicelb --disable-cloud-controller --kubelet-arg cloud-provider=external" K3S_KUBECONFIG_MODE="644" sh -
136140
#curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --disable traefik --disable servicelb --disable-cloud-controller --kubelet-arg cloud-provider=external" K3S_KUBECONFIG_MODE="644" sh -
137141

138142
sleep 10

cicd/k3s-sctpmh/rmconfig.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ if [[ -f "/usr/local/bin/k3s-uninstall.sh" ]]; then
4444
/usr/local/bin/k3s-uninstall.sh
4545
fi
4646

47-
sudo apt-get remove bird2 --yes
47+
sudo apt-get remove bird2 ipvsadm ipset --yes
4848
docker image rm loxilb-io/sctp-server
4949
docker images -a | grep "loxilb-io" | awk '{print $3}' | xargs docker rmi
5050
echo "#########################################"

cicd/k8s-calico-ipvs2-ha-ka-sync/rmconfig.sh

+1
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ vagrant destroy -f worker1
44
vagrant destroy -f master
55
vagrant destroy -f llb1
66
vagrant destroy -f llb2
7+
vagrant destroy -f host

cicd/sctpmh/config.sh

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#!/bin/bash
2+
3+
source ../common.sh
4+
5+
echo "#########################################"
6+
echo "Spawning all hosts"
7+
echo "#########################################"
8+
9+
spawn_docker_host --dock-type loxilb --dock-name llb1
10+
spawn_docker_host --dock-type host --dock-name ep1
11+
spawn_docker_host --dock-type host --dock-name r1
12+
spawn_docker_host --dock-type host --dock-name r2
13+
spawn_docker_host --dock-type host --dock-name r3
14+
spawn_docker_host --dock-type host --dock-name r4
15+
spawn_docker_host --dock-type host --dock-name sw1
16+
spawn_docker_host --dock-type host --dock-name sw2
17+
spawn_docker_host --dock-type host --dock-name user
18+
19+
echo "#########################################"
20+
echo "Connecting and configuring hosts"
21+
echo "#########################################"
22+
23+
connect_docker_hosts user r1
24+
connect_docker_hosts user r2
25+
connect_docker_hosts r1 sw1
26+
connect_docker_hosts r2 sw1
27+
connect_docker_hosts sw1 llb1
28+
connect_docker_hosts llb1 sw2
29+
connect_docker_hosts sw2 r3
30+
connect_docker_hosts sw2 r4
31+
connect_docker_hosts r3 ep1
32+
connect_docker_hosts r4 ep1
33+
34+
create_docker_host_cnbridge --host1 sw1 --host2 llb1
35+
create_docker_host_cnbridge --host1 sw1 --host2 r1
36+
create_docker_host_cnbridge --host1 sw1 --host2 r2
37+
38+
create_docker_host_cnbridge --host1 sw2 --host2 llb1
39+
create_docker_host_cnbridge --host1 sw2 --host2 r3
40+
create_docker_host_cnbridge --host1 sw2 --host2 r4
41+
42+
#node1 config
43+
config_docker_host --host1 user --host2 r1 --ptype phy --addr 1.1.1.1/24 --gw 1.1.1.254
44+
config_docker_host --host1 user --host2 r2 --ptype phy --addr 2.2.2.1/24
45+
config_docker_host --host1 r1 --host2 user --ptype phy --addr 1.1.1.254/24
46+
config_docker_host --host1 r2 --host2 user --ptype phy --addr 2.2.2.254/24
47+
48+
create_docker_host_vlan --host1 llb1 --host2 sw1 --id 11 --ptype untagged
49+
create_docker_host_vlan --host1 r1 --host2 sw1 --id 11 --ptype untagged
50+
create_docker_host_vlan --host1 r2 --host2 sw1 --id 11 --ptype untagged
51+
config_docker_host --host1 r1 --host2 sw1 --ptype vlan --id 11 --addr 11.11.11.253/24 --gw 11.11.11.1
52+
config_docker_host --host1 r2 --host2 sw1 --ptype vlan --id 11 --addr 11.11.11.254/24 --gw 11.11.11.1
53+
config_docker_host --host1 llb1 --host2 sw1 --ptype vlan --id 11 --addr 11.11.11.1/24
54+
55+
create_docker_host_vlan --host1 llb1 --host2 sw2 --id 10 --ptype untagged
56+
create_docker_host_vlan --host1 r3 --host2 sw2 --id 10 --ptype untagged
57+
create_docker_host_vlan --host1 r4 --host2 sw2 --id 10 --ptype untagged
58+
59+
config_docker_host --host1 llb1 --host2 sw2 --ptype vlan --id 10 --addr 10.10.10.1/24
60+
config_docker_host --host1 r3 --host2 sw2 --ptype vlan --id 10 --addr 10.10.10.253/24 --gw 10.10.10.1
61+
config_docker_host --host1 r4 --host2 sw2 --ptype vlan --id 10 --addr 10.10.10.254/24 --gw 10.10.10.1
62+
63+
config_docker_host --host1 ep1 --host2 r3 --ptype phy --addr 31.31.31.1/24 --gw 31.31.31.254
64+
config_docker_host --host1 ep1 --host2 r4 --ptype phy --addr 32.32.32.1/24
65+
config_docker_host --host1 r3 --host2 ep1 --ptype phy --addr 31.31.31.254/24
66+
config_docker_host --host1 r4 --host2 ep1 --ptype phy --addr 32.32.32.254/24
67+
68+
$hexec user ip route change default via 1.1.1.254
69+
$hexec ep1 ip route change default via 31.31.31.254
70+
71+
# Backup paths in user
72+
$hexec user ip route add 124.124.124.1/32 via 2.2.2.254
73+
$hexec user ip route add 125.125.125.1/32 via 2.2.2.254
74+
$hexec user ip route add 134.134.134.1/32 via 2.2.2.254
75+
$hexec user ip route add 135.135.135.1/32 via 2.2.2.254
76+
77+
$hexec ep1 ip route add 124.124.124.1/32 via 32.32.32.254
78+
$hexec ep1 ip route add 125.125.125.1/32 via 32.32.32.254
79+
$hexec ep1 ip route add 134.134.134.1/32 via 32.32.32.254
80+
$hexec ep1 ip route add 135.135.135.1/32 via 32.32.32.254
81+
82+
$hexec llb1 ip route add 1.1.1.0/24 via 11.11.11.253
83+
$hexec llb1 ip route add 2.2.2.0/24 via 11.11.11.254
84+
85+
$hexec llb1 ip route add 31.31.31.0/24 via 10.10.10.253
86+
$hexec llb1 ip route add 32.32.32.0/24 via 10.10.10.254
87+
88+
sleep 20
89+
##Create LB rule user->ep1
90+
create_lb_rule llb1 123.123.123.1 --secips=124.124.124.1,125.125.125.1 --sctp=2020:9999 --endpoints=31.31.31.1:1 --mode=fullnat
91+
92+
##Create LB rule ep1->user
93+
create_lb_rule llb1 133.133.133.1 --secips=134.134.134.1,135.135.135.1 --sctp=2020:9999 --endpoints=1.1.1.1:1 --mode=fullnat
94+
95+
$dexec llb1 loxicmd create ep 1.1.1.1 --name=1.1.1.1_sctp_9999 --probetype=none
96+
$dexec llb1 loxicmd create ep 31.31.31.1 --name=31.31.31.1_sctp_9999 --probetype=none

cicd/sctpmh/input

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
3+
4+
5+
6+

cicd/sctpmh/rmconfig.sh

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/bin/bash
2+
3+
echo "#########################################"
4+
echo "Removing testbed"
5+
echo "#########################################"
6+
7+
source ../common.sh
8+
9+
disconnect_docker_hosts user r1
10+
disconnect_docker_hosts user r2
11+
disconnect_docker_hosts r1 sw1
12+
disconnect_docker_hosts r2 sw1
13+
disconnect_docker_hosts sw1 llb1
14+
disconnect_docker_hosts llb1 sw2
15+
disconnect_docker_hosts sw2 r3
16+
disconnect_docker_hosts sw2 r4
17+
disconnect_docker_hosts r3 ep1
18+
disconnect_docker_hosts r4 ep1
19+
20+
delete_docker_host llb1
21+
delete_docker_host user
22+
delete_docker_host r1
23+
delete_docker_host r2
24+
delete_docker_host r3
25+
delete_docker_host r4
26+
delete_docker_host sw1
27+
delete_docker_host sw2
28+
delete_docker_host ep1
29+
30+
echo "#########################################"
31+
echo "Removed testbed"
32+
echo "#########################################"

cicd/sctpmh/validation.sh

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/bin/bash
2+
echo "SCTP Multihoming - Test case #1"
3+
echo -e "*********************************************************************************"
4+
./validation1.sh
5+
echo -e "\n\n\nSCTP Multihoming - Test case #2"
6+
echo -e "*********************************************************************************"
7+
./validation2.sh
8+
echo -e "\n\n\nSCTP Multihoming - Test case #3"
9+
echo -e "*********************************************************************************"
10+
./validation3.sh
11+
echo -e "\n\n\nSCTP Multihoming - Test case #4"
12+
echo -e "*********************************************************************************"
13+
./validation4.sh
14+
echo -e "\n\n\n*********************************************************************************"

0 commit comments

Comments
 (0)