Merged revisions 372418 via svnmerge from

file:///srv/subversion/repos/asterisk/branches/10

................
  r372418 | mjordan | 2012-09-05 21:49:41 -0500 (Wed, 05 Sep 2012) | 25 lines
  
  Fix DUNDi message routing bug when neighboring peer is unreachable
  
  Consider a scenario where DUNDi peer PBX1 has two peers that are its neighbors,
  PBX2 and PBX3, and where PBX2 and PBX3 are also neighbors.  If the connection
  is temporarily broken between PBX1 and PBX3, PBX1 should not include PBX3 in
  the list of peers it sends to PBX2 in a DPDISCOVER message, as it cannot send
  messages to PBX3.  If it does, PBX2 will assume that PBX3 already received the
  message and fail to forward the message on to PBX3 itself.  This patch fixes
  this by only including peers in a DPDISCOVER message that are reachable by the
  sending node.  This includes all peers with an empty address
  (00:00:00:00:00:00) and that are have been reached by a qualify message.
  
  This patch also prevents attempting to qualify a dynamic peer with an empty
  address until that peer registers.
  
  (closes issue ASTERISK-19309)
  Reported by: Peter Racz
  patches:
    dundi_routing.patch uploaded by Peter Racz (license 6290)
  
  The patch uploaded by Peter was modified slightly for this commit.
  ........
  
  Merged revisions 372417 from http://svn.asterisk.org/svn/asterisk/branches/1.8
................


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10-digiumphones@372443 65c4cc65-6c06-0410-ace0-fbb531ad65f3
10-digiumphones
Automerge script 14 years ago
parent cf2a598cab
commit d4fe146be5

@ -3351,8 +3351,10 @@ static int optimize_transactions(struct dundi_request *dr, int order)
}
AST_LIST_TRAVERSE(&peers, peer, list) {
if (has_permission(&peer->include, dr->dcontext) &&
ast_eid_cmp(&peer->eid, &trans->them_eid) &&
if (ast_eid_cmp(&peer->eid, &empty_eid) && /* peer's eid is not empty (in case of dynamic peers) */
(peer->lastms > -1) && /* peer is reachable */
has_permission(&peer->include, dr->dcontext) && /* peer has destination context */
ast_eid_cmp(&peer->eid, &trans->them_eid) && /* peer is not transaction endpoint */
(peer->order <= order)) {
/* For each other transaction, make sure we don't
ask this EID about the others if they're not
@ -4505,7 +4507,9 @@ static void build_peer(dundi_eid *eid, struct ast_variable *v, int *globalpcmode
if (needregister) {
peer->registerid = ast_sched_add(sched, 2000, do_register, peer);
}
qualify_peer(peer, 1);
if (ast_eid_cmp(&peer->eid, &empty_eid)) {
qualify_peer(peer, 1);
}
}
AST_LIST_UNLOCK(&peers);
}

Loading…
Cancel
Save