Merged revisions 44956 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

................
r44956 | kpfleming | 2006-10-12 13:38:51 -0500 (Thu, 12 Oct 2006) | 10 lines

Merged revisions 44955 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r44955 | kpfleming | 2006-10-12 13:31:26 -0500 (Thu, 12 Oct 2006) | 2 lines

ensure that IAX2 and SIP sockets allow UDP fragmentation when running on Linux (thanks to Brian Candler on the asterisk-dev list for the tip)

........

................


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@44957 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kevin P. Fleming 2006-10-12 18:43:52 +00:00
parent 43f1054d07
commit 035aeb82e4
4 changed files with 30 additions and 0 deletions

View File

@ -16041,10 +16041,13 @@ static int reload_config(enum channelreloadreason reason)
} else {
/* Allow SIP clients on the same host to access us: */
const int reuseFlag = 1;
setsockopt(sipsock, SOL_SOCKET, SO_REUSEADDR,
(const char*)&reuseFlag,
sizeof reuseFlag);
ast_enable_packet_fragmentation(sipsock);
if (bind(sipsock, (struct sockaddr *)&bindaddr, sizeof(bindaddr)) < 0) {
ast_log(LOG_WARNING, "Failed to bind to %s:%d: %s\n",
ast_inet_ntoa(bindaddr.sin_addr), ntohs(bindaddr.sin_port),

View File

@ -515,4 +515,19 @@ int _ast_vasprintf(char **ret, const char *file, int lineno, const char *func, c
}))
#endif
/*!
\brief Disable PMTU discovery on a socket
\param sock The socket to manipulate
\return Nothing
On Linux, UDP sockets default to sending packets with the Dont Fragment (DF)
bit set. This is supposedly done to allow the application to do PMTU
discovery, but Asterisk does not do this.
Because of this, UDP packets sent by Asterisk that are larger than the MTU
of any hop in the path will be lost. This function can be called on a socket
to ensure that the DF bit will not be set.
*/
void ast_enable_packet_fragmentation(int sock);
#endif /* _ASTERISK_UTILS_H */

View File

@ -144,6 +144,8 @@ struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, struct i
if (setsockopt(netsocket, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))
ast_log(LOG_WARNING, "Unable to set TOS to %d\n", tos);
ast_enable_packet_fragmentation(netsocket);
if (!(ns = ast_calloc(1, sizeof(struct ast_netsock)))) {
close(netsocket);
return NULL;

View File

@ -984,3 +984,13 @@ int ast_dynamic_str_thread_build_va(struct ast_dynamic_str **buf, size_t max_len
return res;
}
void ast_enable_packet_fragmentation(int sock)
{
#ifdef __linux__
int val = IP_PMTUDISC_DONT;
if (setsockopt(sock, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val)))
ast_log(LOG_WARNING, "Unable to disable PMTU discovery. Large UDP packets may fail to be delivered when sent from this socket.\n");
#endif
}