Commit eab8bebc authored by Olivier Crête's avatar Olivier Crête

Make the stund try first the new draft before the old stun RFC

parent e8dfb856
...@@ -190,7 +190,7 @@ ssize_t send_safe (int fd, const struct msghdr *msg) ...@@ -190,7 +190,7 @@ ssize_t send_safe (int fd, const struct msghdr *msg)
} }
static int dgram_process (int sock, StunAgent *agent) static int dgram_process (int sock, StunAgent *oldagent, StunAgent *newagent)
{ {
struct sockaddr_storage addr; struct sockaddr_storage addr;
uint8_t buf[STUN_MAX_MESSAGE_SIZE]; uint8_t buf[STUN_MAX_MESSAGE_SIZE];
...@@ -199,6 +199,7 @@ static int dgram_process (int sock, StunAgent *agent) ...@@ -199,6 +199,7 @@ static int dgram_process (int sock, StunAgent *agent)
StunMessage request; StunMessage request;
StunMessage response; StunMessage response;
StunValidationStatus validation; StunValidationStatus validation;
StunAgent *agent = NULL;
struct msghdr mh = struct msghdr mh =
{ {
...@@ -214,7 +215,15 @@ static int dgram_process (int sock, StunAgent *agent) ...@@ -214,7 +215,15 @@ static int dgram_process (int sock, StunAgent *agent)
if (len == (size_t)-1) if (len == (size_t)-1)
return -1; return -1;
validation = stun_agent_validate (agent, &request, buf, len, NULL, 0); validation = stun_agent_validate (newagent, &request, buf, len, NULL, 0);
if (validation == STUN_VALIDATION_SUCCESS) {
agent = newagent;
}
else {
validation = stun_agent_validate (oldagent, &request, buf, len, NULL, 0);
agent = oldagent;
}
/* Unknown attributes */ /* Unknown attributes */
if (validation == STUN_VALIDATION_UNKNOWN_REQUEST_ATTRIBUTE) if (validation == STUN_VALIDATION_UNKNOWN_REQUEST_ATTRIBUTE)
...@@ -258,17 +267,19 @@ send_buf: ...@@ -258,17 +267,19 @@ send_buf:
static int run (int family, int protocol, unsigned port) static int run (int family, int protocol, unsigned port)
{ {
StunAgent agent; StunAgent oldagent;
StunAgent newagent;
int sock = listen_socket (family, SOCK_DGRAM, protocol, htons (port)); int sock = listen_socket (family, SOCK_DGRAM, protocol, htons (port));
if (sock == -1) if (sock == -1)
return -1; return -1;
stun_agent_init (&oldagent, known_attributes,
stun_agent_init (&agent, known_attributes, STUN_COMPATIBILITY_RFC3489, 0);
stun_agent_init (&newagent, known_attributes,
STUN_COMPATIBILITY_3489BIS, STUN_AGENT_USAGE_USE_FINGERPRINT); STUN_COMPATIBILITY_3489BIS, STUN_AGENT_USAGE_USE_FINGERPRINT);
for (;;) for (;;)
dgram_process (sock, &agent); dgram_process (sock, &oldagent, &newagent);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment