|
|
|
|
@ -2415,7 +2415,6 @@ static int __media_packet_encrypt(struct packet_handler_ctx *phc, struct sink_ha
|
|
|
|
|
// returns: drop packet true/false
|
|
|
|
|
static bool media_packet_address_check(struct packet_handler_ctx *phc)
|
|
|
|
|
{
|
|
|
|
|
struct endpoint endpoint;
|
|
|
|
|
bool ret = false;
|
|
|
|
|
|
|
|
|
|
mutex_lock(&phc->mp.stream->in_lock);
|
|
|
|
|
@ -2444,14 +2443,13 @@ static bool media_packet_address_check(struct packet_handler_ctx *phc)
|
|
|
|
|
|
|
|
|
|
PS_SET(phc->mp.stream, RECEIVED);
|
|
|
|
|
|
|
|
|
|
/* do not pay attention to source addresses of incoming packets for asymmetric streams */
|
|
|
|
|
if (MEDIA_ISSET(phc->mp.media, ASYMMETRIC) || phc->mp.stream->el_flags == EL_OFF) {
|
|
|
|
|
endpoint_t *update_endpoint = &phc->mp.stream->endpoint;
|
|
|
|
|
// don't update the "to" address endpoint for asymmetric streams
|
|
|
|
|
if (MEDIA_ISSET(phc->mp.media, ASYMMETRIC))
|
|
|
|
|
update_endpoint = &phc->mp.stream->learned_endpoint;
|
|
|
|
|
|
|
|
|
|
if (phc->mp.stream->el_flags == EL_OFF)
|
|
|
|
|
PS_SET(phc->mp.stream, CONFIRMED);
|
|
|
|
|
mutex_lock(&phc->mp.stream->out_lock);
|
|
|
|
|
if (MEDIA_ISSET(phc->mp.media, ASYMMETRIC) && !phc->mp.stream->learned_endpoint.address.family)
|
|
|
|
|
phc->mp.stream->learned_endpoint = phc->mp.fsin;
|
|
|
|
|
mutex_unlock(&phc->mp.stream->out_lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* confirm sinks for unidirectional streams in order to kernelize */
|
|
|
|
|
if (MEDIA_ISSET(phc->mp.media, UNIDIRECTIONAL)) {
|
|
|
|
|
@ -2465,12 +2463,10 @@ static bool media_packet_address_check(struct packet_handler_ctx *phc)
|
|
|
|
|
if (PS_ISSET(phc->mp.stream, CONFIRMED)) {
|
|
|
|
|
/* see if we need to compare the source address with the known endpoint */
|
|
|
|
|
if (PS_ISSET2(phc->mp.stream, STRICT_SOURCE, MEDIA_HANDOVER)) {
|
|
|
|
|
endpoint = phc->mp.fsin;
|
|
|
|
|
endpoint_t endpoint = phc->mp.fsin;
|
|
|
|
|
mutex_lock(&phc->mp.stream->out_lock);
|
|
|
|
|
|
|
|
|
|
struct endpoint *ps_endpoint = MEDIA_ISSET(phc->mp.media, ASYMMETRIC) ?
|
|
|
|
|
&phc->mp.stream->learned_endpoint : &phc->mp.stream->endpoint;
|
|
|
|
|
int tmp = memcmp(&endpoint, ps_endpoint, sizeof(endpoint));
|
|
|
|
|
int tmp = memcmp(&endpoint, update_endpoint, sizeof(endpoint));
|
|
|
|
|
if (tmp && PS_ISSET(phc->mp.stream, MEDIA_HANDOVER)) {
|
|
|
|
|
/* out_lock remains locked */
|
|
|
|
|
ilog(LOG_INFO | LOG_FLAG_LIMIT, "Peer address changed to %s%s%s",
|
|
|
|
|
@ -2478,7 +2474,7 @@ static bool media_packet_address_check(struct packet_handler_ctx *phc)
|
|
|
|
|
phc->unkernelize = "peer address changed (media handover)";
|
|
|
|
|
phc->unconfirm = true;
|
|
|
|
|
phc->update = true;
|
|
|
|
|
*ps_endpoint = phc->mp.fsin;
|
|
|
|
|
*update_endpoint = phc->mp.fsin;
|
|
|
|
|
goto update_addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -2489,7 +2485,7 @@ static bool media_packet_address_check(struct packet_handler_ctx *phc)
|
|
|
|
|
"got %s%s%s, "
|
|
|
|
|
"expected %s%s%s",
|
|
|
|
|
FMT_M(endpoint_print_buf(&endpoint)),
|
|
|
|
|
FMT_M(endpoint_print_buf(ps_endpoint)));
|
|
|
|
|
FMT_M(endpoint_print_buf(update_endpoint)));
|
|
|
|
|
atomic64_inc_na(&phc->mp.stream->stats_in->errors);
|
|
|
|
|
atomic64_inc_na(&phc->mp.sfd->local_intf->stats->in.errors);
|
|
|
|
|
ret = true;
|
|
|
|
|
@ -2574,14 +2570,15 @@ update_peerinfo:
|
|
|
|
|
// if we're during the wait time, check the received address against the previously
|
|
|
|
|
// learned address. if they're the same, ignore this packet for learning purposes
|
|
|
|
|
if (!wait_time || !phc->mp.stream->learned_endpoint.address.family ||
|
|
|
|
|
memcmp(use_endpoint_confirm, &phc->mp.stream->learned_endpoint, sizeof(endpoint)))
|
|
|
|
|
memcmp(use_endpoint_confirm, &phc->mp.stream->learned_endpoint,
|
|
|
|
|
sizeof(*use_endpoint_confirm)))
|
|
|
|
|
{
|
|
|
|
|
endpoint = phc->mp.stream->endpoint;
|
|
|
|
|
phc->mp.stream->endpoint = *use_endpoint_confirm;
|
|
|
|
|
endpoint_t endpoint = *update_endpoint;
|
|
|
|
|
*update_endpoint = *use_endpoint_confirm;
|
|
|
|
|
phc->mp.stream->learned_endpoint = *use_endpoint_confirm;
|
|
|
|
|
if (memcmp(&endpoint, &phc->mp.stream->endpoint, sizeof(endpoint))) {
|
|
|
|
|
if (memcmp(&endpoint, update_endpoint, sizeof(endpoint))) {
|
|
|
|
|
ilog(LOG_DEBUG | LOG_FLAG_LIMIT, "Peer address changed from %s%s%s to %s%s%s",
|
|
|
|
|
FMT_M(endpoint_print_buf(&endpoint)),
|
|
|
|
|
FMT_M(endpoint_print_buf(update_endpoint)),
|
|
|
|
|
FMT_M(endpoint_print_buf(use_endpoint_confirm)));
|
|
|
|
|
phc->unkernelize = "peer address changed";
|
|
|
|
|
phc->update = true;
|
|
|
|
|
|