diff options
| author | Donatas Abraitis <donatas.abraitis@gmail.com> | 2021-05-05 13:45:39 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-05 13:45:39 +0300 |
| commit | 48c20391997a9809c710d4669a05f9eee8b5bff8 (patch) | |
| tree | e6930f157a9c7b0a45947490bafff11410b6ccc3 /lib | |
| parent | 4d504309d3be720420225e1ddd45d673f5d6ec23 (diff) | |
| parent | 4ab467017e922b6b32565952523051862e636e4e (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.c | 36 | ||||
| -rw-r--r-- | lib/sockopt.h | 20 |
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 |
