diff --git a/acl.c b/acl.c
index 6672b9a392ff9d324e4e7916e2937c1e773ab04b..60d7a36a03c8016bd1a182f5919900b01c9f669a 100755
--- a/acl.c
+++ b/acl.c
@@ -116,3 +116,8 @@ int ast_get_ip(struct sockaddr_in *sin, char *value)
 	return 0;
 }
 
+int inaddrcmp(struct sockaddr_in *sin1, struct sockaddr_in *sin2)
+{
+	return ((sin1->sin_addr.s_addr == sin2->sin_addr.s_addr )
+			&& (sin1->sin_port == sin2->sin_port));
+}
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 1ea30e07393d7c36bc9688d3ee8b802533fcecb8..f13f8fa3dd7552621e9b6c3b55f3f7cfc52ed611 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -3110,7 +3110,7 @@ static int iax2_ack_registry(struct iax_ies *ies, struct sockaddr_in *sin, int c
 	}
 	memcpy(&oldus, &reg->us, sizeof(oldus));
 	oldmsgs = reg->messages;
-	if (memcmp(&reg->addr, sin, sizeof(&reg->addr))) {
+	if (inaddrcmp(&reg->addr, sin)) {
 		ast_log(LOG_WARNING, "Received unsolicited registry ack from '%s'\n", inet_ntoa(sin->sin_addr));
 		return -1;
 	}
@@ -3123,7 +3123,7 @@ static int iax2_ack_registry(struct iax_ies *ies, struct sockaddr_in *sin, int c
 			ast_sched_del(sched, reg->expire);
 		reg->expire = ast_sched_add(sched, (5 * reg->refresh / 6) * 1000, iax2_do_register_s, reg);
 	}
-	if ((memcmp(&oldus, &reg->us, sizeof(oldus)) || (reg->messages != oldmsgs)) && (option_verbose > 2)) {
+	if ((inaddrcmp(&oldus, &reg->us) || (reg->messages != oldmsgs)) && (option_verbose > 2)) {
 		if (reg->messages > 65534)
 			snprintf(msgstatus, sizeof(msgstatus), " with message(s) waiting\n");
 		else if (reg->messages > 1)
@@ -3222,7 +3222,7 @@ static int update_registry(char *name, struct sockaddr_in *sin, int callno)
 	memset(&ied, 0, sizeof(ied));
 	for (p = peerl.peers;p;p = p->next) {
 		if (!strcasecmp(name, p->name)) {
-			if (memcmp(&p->addr, sin, sizeof(p->addr))) {
+			if (inaddrcmp(&p->addr, sin)) {
 				if (regfunk)
 					regfunk(p->name, 1);
 				if  (option_verbose > 2)
@@ -3292,7 +3292,7 @@ static int registry_rerequest(struct iax_ies *ies, int callno, struct sockaddr_i
 		strncpy(challenge, ies->challenge, sizeof(challenge) - 1);
 	memset(&ied, 0, sizeof(ied));
 	reg = iaxs[callno]->reg;
-			if (memcmp(&reg->addr, sin, sizeof(&reg->addr))) {
+			if (inaddrcmp(&reg->addr, sin)) {
 				ast_log(LOG_WARNING, "Received unsolicited registry authenticate request from '%s'\n", inet_ntoa(sin->sin_addr));
 				return -1;
 			}
@@ -3423,7 +3423,7 @@ static int send_trunk(struct iax2_peer *peer)
 		if (iaxtrunkdebug)
 			ast_verbose("Call %d is at %s:%d (%d)\n", x, inet_ntoa(iaxs[x]->addr.sin_addr), ntohs(iaxs[x]->addr.sin_port), iaxs[x]->addr.sin_family);
 #endif
-		if (iaxs[x] && iaxs[x]->trunk && iaxs[x]->trunkdatalen && !memcmp(&iaxs[x]->addr, &peer->addr, sizeof(iaxs[x]->addr))) {
+		if (iaxs[x] && iaxs[x]->trunk && iaxs[x]->trunkdatalen && !inaddrcmp(&iaxs[x]->addr, &peer->addr)) {
 			if (iaxtrunkdebug)
 				ast_verbose(" -- Sending call %d via trunk to %s:%d\n", x, inet_ntoa(iaxs[x]->addr.sin_addr), ntohs(iaxs[x]->addr.sin_port));
 			if (len >= iaxs[x]->trunkdatalen + sizeof(struct ast_iax2_meta_trunk_entry)) {
@@ -3574,7 +3574,7 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
 			ast_pthread_mutex_lock(&peerl.lock);
 			peer = peerl.peers;
 			while(peer) {
-				if (!memcmp(&peer->addr, &sin, sizeof(peer->addr)))
+				if (!inaddrcmp(&peer->addr, &sin))
 					break;
 				peer = peer->next;
 			}
@@ -3693,7 +3693,7 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
 			ast_pthread_mutex_unlock(&iaxsl[fr.callno]);
 		return 1;
 	}
-	if (!memcmp(&sin, &iaxs[fr.callno]->addr, sizeof(sin)))
+	if (!inaddrcmp(&sin, &iaxs[fr.callno]->addr))
 		iaxs[fr.callno]->peercallno = (unsigned short)(ntohs(mh->callno) & ~IAX_FLAG_FULL);
 	if (ntohs(mh->callno) & IAX_FLAG_FULL) {
 		if (option_debug)
@@ -3757,7 +3757,7 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
 
 		/* Handle implicit ACKing unless this is an INVAL, and only if this is 
 		   from the real peer, not the transfer peer */
-		if (!memcmp(&sin, &iaxs[fr.callno]->addr, sizeof(sin)) && 
+		if (!inaddrcmp(&sin, &iaxs[fr.callno]->addr) && 
 			(((f.subclass != IAX_COMMAND_INVAL)) ||
 			(f.frametype != AST_FRAME_IAX))) {
 			unsigned char x;
@@ -3800,7 +3800,7 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
 			} else
 				ast_log(LOG_DEBUG, "Received iseqno %d not within window %d->%d\n", fr.iseqno, iaxs[fr.callno]->rseqno, iaxs[fr.callno]->oseqno);
 		}
-		if (memcmp(&sin, &iaxs[fr.callno]->addr, sizeof(sin)) && 
+		if (inaddrcmp(&sin, &iaxs[fr.callno]->addr) && 
 			((f.frametype != AST_FRAME_IAX) || 
 			 ((f.subclass != IAX_COMMAND_TXACC) &&
 			  (f.subclass != IAX_COMMAND_TXCNT)))) {
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index ad096208abf029e13794c3031c789092b95e3467..64a976e6e1f82e77a5fc47e508d3d01aa914750e 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2662,7 +2662,7 @@ static int parse_contact(struct sip_pvt *pvt, struct sip_peer *p, struct sip_req
 		expiry = max_expiry;
 	p->expire = ast_sched_add(sched, (expiry + 10) * 1000, expire_register, p);
 	pvt->expiry = expiry;
-	if (memcmp(&p->addr, &oldsin, sizeof(oldsin))) {
+	if (inaddrcmp(&p->addr, &oldsin)) {
 		sip_poke_peer(p);
 		if (option_verbose > 2)
 			ast_verbose(VERBOSE_PREFIX_3 "Registered SIP '%s' at %s port %d expires %d\n", p->username, inet_ntoa(p->addr.sin_addr), ntohs(p->addr.sin_port), expiry);
@@ -3203,7 +3203,7 @@ static int check_user(struct sip_pvt *p, struct sip_request *req, char *cmd, cha
 		ast_pthread_mutex_lock(&peerl.lock);
 		peer = peerl.peers;
 		while(peer) {
-			if (!memcmp(&peer->addr, &p->recv, sizeof(peer->addr))) {
+			if (!inaddrcmp(&peer->addr, &p->recv)) {
 				/* Take the peer */
 				p->nat = peer->nat;
 				if (p->rtp) {
diff --git a/include/asterisk/acl.h b/include/asterisk/acl.h
index 881821c53b3ff61dedbeede33ff8cca111aa96cf..e2def3cb6cf3b1c1baf037df5f6c099e1f24adf3 100755
--- a/include/asterisk/acl.h
+++ b/include/asterisk/acl.h
@@ -28,6 +28,7 @@ extern void ast_free_ha(struct ast_ha *ha);
 extern struct ast_ha *ast_append_ha(char *sense, char *stuff, struct ast_ha *path);
 extern int ast_apply_ha(struct ast_ha *ha, struct sockaddr_in *sin);
 extern int ast_get_ip(struct sockaddr_in *sin, char *value);
+extern int inaddrcmp(struct sockaddr_in *sin1, struct sockaddr_in *sin2);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }