summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas.abraitis@gmail.com>2021-05-05 13:45:39 +0300
committerGitHub <noreply@github.com>2021-05-05 13:45:39 +0300
commit48c20391997a9809c710d4669a05f9eee8b5bff8 (patch)
treee6930f157a9c7b0a45947490bafff11410b6ccc3 /lib
parent4d504309d3be720420225e1ddd45d673f5d6ec23 (diff)
parent4ab467017e922b6b32565952523051862e636e4e (diff)
Merge pull request #8564 from rameshabhinay/bgp_tcp_mss
bgpd: Support tcp-mss for bgp neighbors
Diffstat (limited to 'lib')
-rw-r--r--lib/sockopt.c36
-rw-r--r--lib/sockopt.h20
2 files changed, 56 insertions, 0 deletions
diff --git a/lib/sockopt.c b/lib/sockopt.c
index b624fe2230..98bfda5079 100644
--- a/lib/sockopt.c
+++ b/lib/sockopt.c
@@ -667,3 +667,39 @@ int sockopt_tcp_signature(int sock, union sockunion *su, const char *password)
{
return sockopt_tcp_signature_ext(sock, su, 0, password);
}
+
+/* set TCP mss value to socket */
+int sockopt_tcp_mss_set(int sock, int tcp_maxseg)
+{
+ int ret = 0;
+ socklen_t tcp_maxseg_len = sizeof(tcp_maxseg);
+
+ ret = setsockopt(sock, IPPROTO_TCP, TCP_MAXSEG, &tcp_maxseg,
+ tcp_maxseg_len);
+ if (ret != 0) {
+ flog_err_sys(EC_LIB_SYSTEM_CALL,
+ "%s failed: setsockopt(%d): %s", __func__, sock,
+ safe_strerror(errno));
+ }
+
+ return ret;
+}
+
+/* get TCP mss value synced by socket */
+int sockopt_tcp_mss_get(int sock)
+{
+ int ret = 0;
+ int tcp_maxseg = 0;
+ socklen_t tcp_maxseg_len = sizeof(tcp_maxseg);
+
+ ret = getsockopt(sock, IPPROTO_TCP, TCP_MAXSEG, &tcp_maxseg,
+ &tcp_maxseg_len);
+ if (ret != 0) {
+ flog_err_sys(EC_LIB_SYSTEM_CALL,
+ "%s failed: getsockopt(%d): %s", __func__, sock,
+ safe_strerror(errno));
+ return 0;
+ }
+
+ return tcp_maxseg;
+}
diff --git a/lib/sockopt.h b/lib/sockopt.h
index 545abe631f..6c80841e3c 100644
--- a/lib/sockopt.h
+++ b/lib/sockopt.h
@@ -133,6 +133,26 @@ extern int sockopt_tcp_signature(int sock, union sockunion *su,
extern int sockopt_tcp_signature_ext(int sock, union sockunion *su,
uint16_t prefixlen, const char *password);
+/*
+ * set TCP max segment size. This option allows user to configure
+ * max segment size for TCP session
+ *
+ * sock
+ * Socket to enable option on.
+ *
+ * tcp_maxseg
+ * value used for TCP segment size negotiation during SYN
+ */
+extern int sockopt_tcp_mss_set(int sock, int tcp_maxseg);
+
+/*
+ * get TCP max segment size. This option allows user to get
+ * the segment size for TCP session
+ *
+ * sock
+ * Socket to get max segement size.
+ */
+extern int sockopt_tcp_mss_get(int sock);
#ifdef __cplusplus
}
#endif