Bug 6297: Change subscriber's RLOC selection algo 29/43029/5
authorMiroslav Toth <mirtoth@cisco.com>
Wed, 3 Aug 2016 08:47:16 +0000 (10:47 +0200)
committerMiroslav Toth <mirtoth@cisco.com>
Fri, 5 Aug 2016 11:57:46 +0000 (13:57 +0200)
Change-Id: Ie30a31f6bb37aa8d7c1d21e6cfb9cd8ed53affc5
Signed-off-by: Miroslav Toth <mirtoth@cisco.com>
12 files changed:
integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MappingServiceIntegrationTest.java
integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MultiSiteScenario.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapResolver.java
mappingservice/implementation/src/test/java/org/opendaylight/lispflowmapping/implementation/lisp/MapResolverTest.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/MapRegisterSerializer.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/serializer/MapRequestSerializer.java
mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/LispAddressUtil.java
mappingservice/lisp-proto/src/main/yang/odl-lisp-proto.yang
mappingservice/lisp-proto/src/test/java/org/opendaylight/lispflowmapping/serializer/MapRequestSerializationTest.java
mappingservice/southbound/src/main/java/org/opendaylight/lispflowmapping/southbound/lisp/LispSouthboundHandler.java
mappingservice/southbound/src/main/java/org/opendaylight/lispflowmapping/southbound/lisp/LispXtrSouthboundHandler.java
mappingservice/southbound/src/test/java/org/opendaylight/lispflowmapping/southbound/lisp/LispXtrSouthboundHandlerTest.java

index b5bd3dea8358baae39e22482ac28589b4cb7c7cb..26d2b5f070d9033897ac764b616d568ad3177289 100644 (file)
@@ -826,7 +826,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
         sendPacket(mapRegisterPacketWithoutNotify);
 
         ByteBuffer readBuf = ByteBuffer.wrap(receivePacket().getData());
-        MapRequest smr = MapRequestSerializer.getInstance().deserialize(readBuf);
+        MapRequest smr = MapRequestSerializer.getInstance().deserialize(readBuf, null);
         assertTrue(smr.isSmr());
         Eid sourceEid = smr.getSourceEid().getEid();
         assertTrue(LispAddressUtil.asIpv4Eid("153.16.254.1").equals(sourceEid));
@@ -2071,7 +2071,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
 
     private MapRequest receiveMapRequest(DatagramSocket datagramSocket) throws SocketTimeoutException {
         return MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket(
-                datagramSocket, 30000).getData()));
+                datagramSocket, 30000).getData()), null);
     }
 
     private MapNotify receiveMapNotify() throws SocketTimeoutException {
index c50a4a028c2d4ee311be33126296cec44aff6da2..db5b4239392073aab77f5876de220e26f35f59de 100644 (file)
@@ -442,7 +442,7 @@ class MultiSiteScenario {
     private List<MapRequest> translateBuffersToMapRequest(byte[][] buffers) {
         final List<MapRequest> mapRequests = new ArrayList<>();
         for (byte[] buffer : buffers) {
-            final MapRequest mapRequest = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(buffer));
+            final MapRequest mapRequest = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(buffer), null);
             assertNotNull(mapRequest);
             mapRequests.add(mapRequest);
         }
index 2162461331725fdb4556a5b8fb8d1ff5ac29d030..b29604d43f673cf1569b2996c6f73fd104242217 100644 (file)
@@ -8,10 +8,11 @@
 
 package org.opendaylight.lispflowmapping.implementation.lisp;
 
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
-
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
 import org.opendaylight.lispflowmapping.interfaces.dao.SubscriberRLOC;
@@ -21,14 +22,21 @@ import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingServic
 import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
 import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPath;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4PrefixBinaryAfi;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6BinaryAfi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6PrefixBinaryAfi;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItem;
@@ -37,7 +45,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lo
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord.Action;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapreplymessage.MapReplyBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
@@ -46,9 +53,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev15090
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Sets;
-
 public class MapResolver implements IMapResolverAsync {
     protected static final Logger LOG = LoggerFactory.getLogger(MapResolver.class);
 
@@ -89,15 +93,18 @@ public class MapResolver implements IMapResolverAsync {
         replyBuilder.setProbe(false);
         replyBuilder.setSecurityEnabled(false);
         replyBuilder.setNonce(request.getNonce());
-        replyBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
+        replyBuilder.setMappingRecordItem(new ArrayList<>());
+        List<ItrRloc> itrRlocs = request.getItrRloc();
+        final IpAddressBinary sourceRloc = request.getSourceRloc();
+
         for (EidItem eidRecord : request.getEidItem()) {
             MappingRecord mapping = (MappingRecord) mapService.getMapping(srcEid,
                     eidRecord.getEid());
             if (mapping != null) {
-                List<ItrRloc> itrRlocs = request.getItrRloc();
                 if (itrRlocs != null && itrRlocs.size() != 0) {
                     if (subscriptionService) {
-                        updateSubscribers(itrRlocs.get(0).getRloc(), eidRecord.getEid(), mapping.getEid(), srcEid);
+                        final Rloc resolvedRloc = resolveRloc(itrRlocs, sourceRloc);
+                        updateSubscribers(resolvedRloc, eidRecord.getEid(), mapping.getEid(), srcEid);
                     }
                     mapping = updateLocators(mapping, itrRlocs);
                 }
@@ -110,6 +117,56 @@ public class MapResolver implements IMapResolverAsync {
         requestHandler.handleMapReply(replyBuilder.build());
     }
 
+    private static boolean isEqualIpVersion(IpAddressBinary srcRloc, Rloc rloc) {
+        if (srcRloc.getIpv4AddressBinary() != null) {
+            if (rloc.getAddressType() == Ipv4Afi.class ||
+                    rloc.getAddressType() == Ipv4BinaryAfi.class ||
+                    rloc.getAddressType() == Ipv4PrefixAfi.class ||
+                    rloc.getAddressType() == Ipv4PrefixBinaryAfi.class) {
+                return true;
+            }
+        } else if (rloc.getAddressType() == Ipv6Afi.class ||
+                rloc.getAddressType() == Ipv6BinaryAfi.class ||
+                rloc.getAddressType() == Ipv6PrefixAfi.class ||
+                rloc.getAddressType() == Ipv6PrefixBinaryAfi.class) {
+            return true;
+        }
+        return false;
+    }
+
+    private Rloc resolveRloc(List<ItrRloc> itrRlocList, IpAddressBinary srcRloc) {
+        if (srcRloc == null) {
+            return itrRlocList.get(0).getRloc();
+        }
+        byte[] srcRlocByte;
+        if (srcRloc.getIpv4AddressBinary() != null) {
+            srcRlocByte = srcRloc.getIpv4AddressBinary().getValue();
+        } else {
+            srcRlocByte = srcRloc.getIpv6AddressBinary().getValue();
+        }
+
+        Rloc equalIpvRloc = null;
+        for (ItrRloc itrRloc : itrRlocList) {
+            final Rloc rloc = itrRloc.getRloc();
+            final byte[] itrRlocByte = LispAddressUtil.ipAddressToByteArray(rloc.getAddress());
+
+            // return an Rloc equal to the source Rloc
+            if (itrRlocByte != null && LispAddressUtil.compareIpAddressByteArrays(srcRlocByte, itrRlocByte) == 0) {
+                return rloc;
+            }
+            // else lookup the first Rloc with identical Ip version
+            if (equalIpvRloc == null && isEqualIpVersion(srcRloc, rloc)) {
+                equalIpvRloc = rloc;
+            }
+        }
+        if (equalIpvRloc != null) {
+            return equalIpvRloc;
+        } else {
+            // if none of the above, return the first Rloc
+            return itrRlocList.get(0).getRloc();
+        }
+    }
+
     private MappingRecord getNegativeMapping(Eid eid) {
         MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
         recordBuilder.setAuthoritative(false);
index b90e758a93ef4608815600dd25c32defe55fc98e..d4b6dcbfc806c6b8fef518bc5b1d5e56367c0c70 100644 (file)
@@ -7,11 +7,15 @@
  */
 package org.opendaylight.lispflowmapping.implementation.lisp;
 
+import static org.junit.Assert.assertEquals;
+
+import com.google.common.collect.Lists;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 import org.opendaylight.lispflowmapping.implementation.LispMappingService;
 import org.opendaylight.lispflowmapping.implementation.MappingService;
@@ -22,15 +26,32 @@ import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
 import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list
-        .MappingRecordItemBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Mac;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItemBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkeyBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container
-        .MappingRecordBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapreplymessage.MapReplyBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocBuilder;
@@ -38,9 +59,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.ma
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEidBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequestBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container
-        .MappingAuthkeyBuilder;
 
 public class MapResolverTest {
 
@@ -59,17 +79,31 @@ public class MapResolverTest {
     private static final String IPV6_STRING =           "0:0:0:0:0:0:0:1";
     private static final String IPV6_PREFIX_STRING =    "/128";
 
+    private static final byte[] IPV4_BINARY_BYTES_1 = new byte[]{1, 2, 3, 0};
+    private static final byte[] IPV4_BINARY_BYTES_2 = new byte[]{1, 2, 5, 0};
+    private static final byte[] IPV6_BINARY_BYTES_1 = new byte[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
+
     private static final LocatorRecordKey LOCATOR_RECORD_KEY = new LocatorRecordKey("key");
     private static final int TTL_RLOC_TIMED_OUT = 1;
 
     private static final IpAddress IPV4_ADDRESS_1 = new IpAddress(new Ipv4Address(IPV4_STRING_1));
     private static final IpAddress IPV4_ADDRESS_2 = new IpAddress(new Ipv4Address(IPV4_STRING_2));
 
+    private static final IpAddressBinary IPV4_ADDRESS_BINARY_1 =
+            new IpAddressBinary(new Ipv4AddressBinary(IPV4_BINARY_BYTES_1));
+    private static final IpAddressBinary IPV4_ADDRESS_BINARY_2 =
+            new IpAddressBinary(new Ipv4AddressBinary(IPV4_BINARY_BYTES_2));
+    private static final IpAddressBinary IPV6_ADDRESS_BINARY =
+            new IpAddressBinary(new Ipv6AddressBinary(IPV6_BINARY_BYTES_1));
+
     private static final Eid IPV4_PREFIX_EID_1 = LispAddressUtil.asIpv4PrefixEid(IPV4_STRING_1 + IPV4_PREFIX_STRING);
     private static final Eid IPV4_PREFIX_EID_2 = LispAddressUtil.asIpv4PrefixEid(IPV4_STRING_2 + IPV4_PREFIX_STRING);
     private static final Eid IPV6_PREFIX_EID = LispAddressUtil.asIpv6PrefixEid(IPV6_STRING + IPV6_PREFIX_STRING);
     private static final Eid SOURCE_DEST_KEY_EID = LispAddressUtil.asSrcDstEid(IPV4_SOURCE, IPV4_STRING_2, 24, 24, 0);
 
+    private static final Address IPV4_ADDRESS = new Ipv4Builder().setIpv4(new Ipv4Address(IPV4_STRING_1)).build();
+    private static final Address IPV6_ADDRESS = new Ipv6Builder().setIpv6(new Ipv6Address(IPV6_STRING)).build();
+
     private static final Rloc RLOC_1 = LispAddressUtil.asIpv4Rloc(IPV4_RLOC_STRING_1);
     private static MapRequestBuilder mapRequestBuilder = getDefaultMapRequestBuilder();
     private static final SubscriberRLOC SUBSCRIBER_RLOC_1 = new SubscriberRLOC(RLOC_1,
@@ -120,7 +154,6 @@ public class MapResolverTest {
                 .setAction(MappingRecord.Action.NativelyForward)
                 .setRecordTtl(TTL_RLOC_TIMED_OUT);
 
-
         Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
                 .thenReturn(null);
         Mockito.when(mapServiceMock.getAuthenticationKey(IPV4_PREFIX_EID_1))
@@ -162,6 +195,98 @@ public class MapResolverTest {
         Mockito.verify(subscriberSetMock, Mockito.never()).remove(Mockito.any(SubscriberRLOC.class));
     }
 
+    /**
+     * Tests {@link MapResolver#isEqualIpVersion} method.
+     */
+    @Test
+    public void isEqualIpVersionTest() {
+        // input mapping
+        final LocatorRecordBuilder locatorRecordBuilder = getDefaultLocatorBuilder();
+        final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
+        mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder.build());
+
+        Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
+                .thenReturn(mappingRecordBuilder.build());
+        Mockito.when(mapServiceMock.getData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1, SubKeys.SUBSCRIBERS))
+                .thenReturn(subscriberSetMock);
+        Mockito.when(subscriberSetMock.contains(Mockito.any(SubscriberRLOC.class))).thenReturn(false);
+
+        // ----------------------
+        // with sourceRloc = null
+        List<ItrRloc> itrRlocList = Lists.newArrayList(
+                newItrRloc(MacAfi.class, null),
+                newItrRloc(Ipv4BinaryAfi.class, IPV4_ADDRESS));
+
+        ArgumentCaptor<SubscriberRLOC> captor = ArgumentCaptor.forClass(SubscriberRLOC.class);
+        mapResolver.handleMapRequest(mapRequestBuilder.setSourceRloc(null).setItrRloc(itrRlocList).build());
+        Mockito.verify(subscriberSetMock).add(captor.capture());
+        // Since mapRequest's sourceRloc is null, first ItrRloc from the itrRlocList must be used.
+        assertEquals(MacAfi.class, captor.getValue().getSrcRloc().getAddressType());
+
+        // ----------------------
+        // with sourceRloc address = itrRloc address
+        itrRlocList = Lists.newArrayList(
+                newItrRloc(MacAfi.class, null),
+                newItrRloc(Ipv4BinaryAfi.class, IPV4_ADDRESS));
+
+        MapRequest mapRequest = mapRequestBuilder
+                .setSourceRloc(IPV4_ADDRESS_BINARY_1)
+                .setItrRloc(itrRlocList).build();
+
+        captor = ArgumentCaptor.forClass(SubscriberRLOC.class);
+        mapResolver.handleMapRequest(mapRequest);
+        Mockito.verify(subscriberSetMock, Mockito.times(2)).add(captor.capture());
+        assertEquals(IPV4_ADDRESS, captor.getValue().getSrcRloc().getAddress());
+
+        // ----------------------
+        // with sourceRloc address Afi = itrRloc address Afi (for Ipv4)
+        itrRlocList = Lists.newArrayList(
+                newItrRloc(MacAfi.class, null),
+                newItrRloc(Ipv6Afi.class, IPV6_ADDRESS),
+                newItrRloc(Ipv4Afi.class, IPV4_ADDRESS));
+
+        mapRequest = mapRequestBuilder
+                .setSourceRloc(IPV6_ADDRESS_BINARY)
+                .setItrRloc(itrRlocList).build();
+
+        captor = ArgumentCaptor.forClass(SubscriberRLOC.class);
+        mapResolver.handleMapRequest(mapRequest);
+        Mockito.verify(subscriberSetMock, Mockito.times(3)).add(captor.capture());
+        assertEquals(IPV6_ADDRESS, captor.getValue().getSrcRloc().getAddress());
+
+        // ----------------------
+        // with sourceRloc address Afi = itrRloc address Afi (for Ipv6)
+        itrRlocList = Lists.newArrayList(
+                newItrRloc(MacAfi.class, null),
+                newItrRloc(Ipv6Afi.class, IPV6_ADDRESS),
+                newItrRloc(Ipv4Afi.class, IPV4_ADDRESS));
+
+        mapRequest = mapRequestBuilder
+                .setSourceRloc(IPV4_ADDRESS_BINARY_2)
+                .setItrRloc(itrRlocList).build();
+
+        captor = ArgumentCaptor.forClass(SubscriberRLOC.class);
+        mapResolver.handleMapRequest(mapRequest);
+        Mockito.verify(subscriberSetMock, Mockito.times(4)).add(captor.capture());
+        assertEquals(IPV4_ADDRESS, captor.getValue().getSrcRloc().getAddress());
+
+        // ----------------------
+        // with no common ip address nor Afi
+        final Mac mac = new MacBuilder().setMac(new MacAddress("aa:bb:cc:dd:ee:ff")).build();
+        itrRlocList = Lists.newArrayList(
+                newItrRloc(MacAfi.class, mac),
+                newItrRloc(NoAddressAfi.class, Mockito.mock(NoAddress.class)));
+
+        mapRequest = mapRequestBuilder
+                .setSourceRloc(IPV4_ADDRESS_BINARY_1)
+                .setItrRloc(itrRlocList).build();
+
+        captor = ArgumentCaptor.forClass(SubscriberRLOC.class);
+        mapResolver.handleMapRequest(mapRequest);
+        Mockito.verify(subscriberSetMock, Mockito.times(5)).add(captor.capture());
+        assertEquals(mac, captor.getValue().getSrcRloc().getAddress());
+    }
+
     /**
      * Tests {@link MapResolver#handleMapRequest} method.
      */
@@ -332,6 +457,12 @@ public class MapResolverTest {
         Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
     }
 
+    private static ItrRloc newItrRloc(Class<? extends LispAddressFamily> clazz, Address address) {
+        return new ItrRlocBuilder().setRloc(new RlocBuilder()
+                .setAddress(address)
+                .setAddressType(clazz).build()).build();
+    }
+
     private static List<ItrRloc> getDefaultItrRlocList() {
         final List<ItrRloc> itrRlocList = new ArrayList<>();
         final ItrRloc itrRloc = new ItrRlocBuilder()
index 449441c0c90e4c955ddc8877f6eb14fffdf01704..cc2b8446dc4c6329551270aebd5400cccf4bc757 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.lispflowmapping.lisp.serializer;
 
-import java.net.Inet4Address;
-import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -16,10 +14,8 @@ import java.util.List;
 import org.apache.commons.lang3.BooleanUtils;
 import org.opendaylight.lispflowmapping.lisp.serializer.exception.LispSerializationException;
 import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
 import org.opendaylight.lispflowmapping.lisp.util.NumberUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRegister;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MessageType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.SiteId;
@@ -125,7 +121,7 @@ public final class MapRegisterSerializer {
                 for (MappingRecordBuilder mrb : mrbs) {
                     mrb.setXtrId(xtrId);
                     mrb.setSiteId(siteId);
-                    mrb.setSourceRloc(getSourceRloc(sourceRloc));
+                    mrb.setSourceRloc(LispAddressUtil.addressBinaryFromInet(sourceRloc));
                     builder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
                             mrb.build()).build());
                 }
@@ -145,21 +141,6 @@ public final class MapRegisterSerializer {
             throw new LispSerializationException("Couldn't deserialize Map-Register (len="
                     + registerBuffer.capacity() + ")", re);
         }
-
-    }
-
-    private static IpAddressBinary getSourceRloc(InetAddress sourceRloc) {
-        if (sourceRloc == null) {
-            sourceRloc = Inet4Address.getLoopbackAddress();
-        }
-
-        if (sourceRloc instanceof Inet4Address) {
-            return new IpAddressBinary(new Ipv4AddressBinary(sourceRloc.getAddress()));
-        } else if (sourceRloc instanceof Inet6Address) {
-            return new IpAddressBinary(new Ipv6AddressBinary(sourceRloc.getAddress()));
-        }
-
-        return null;
     }
 
     private interface Flags {
index 4340cdfb589dc317ba71ae47a4dd943f83642ad0..40a1cb3d50fa6d040e8b70e16df951af25bcab40 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.lispflowmapping.lisp.serializer;
 
+import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import org.apache.commons.lang3.BooleanUtils;
@@ -14,6 +15,7 @@ import org.opendaylight.lispflowmapping.lisp.serializer.address.LispAddressSeria
 import org.opendaylight.lispflowmapping.lisp.serializer.address.LispAddressSerializerContext;
 import org.opendaylight.lispflowmapping.lisp.serializer.exception.LispSerializationException;
 import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
 import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
 import org.opendaylight.lispflowmapping.lisp.util.NumberUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest;
@@ -115,7 +117,7 @@ public final class MapRequestSerializer {
     }
 
     @SuppressWarnings("checkstyle:IllegalCatch")
-    public MapRequest deserialize(ByteBuffer requestBuffer) {
+    public MapRequest deserialize(ByteBuffer requestBuffer, InetAddress sourceRloc) {
         try {
             MapRequestBuilder builder = new MapRequestBuilder();
 
@@ -161,6 +163,7 @@ public final class MapRequestSerializer {
                     LOG.warn("Couldn't deserialize Map-Reply encapsulated in Map-Request", re);
                 }
             }
+            builder.setSourceRloc(LispAddressUtil.addressBinaryFromInet(sourceRloc));
             return builder.build();
         } catch (RuntimeException re) {
             throw new LispSerializationException("Couldn't deserialize Map-Request (len="
index e8f238eea48f1964ccd58a863d51e29d08965ece..b210f09b9e80e58fc4927fd95192b8e67f2dc3b2 100644 (file)
@@ -64,6 +64,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.addres
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
@@ -806,6 +807,26 @@ public final class LispAddressUtil {
         return rb.build();
     }
 
+    /**
+     * Converts the {@link InetAddress} into Ipv4 or Ipv6 {@link IpAddressBinary}. If null parameter is passed, method
+     * returns the Ipv4 loopback address (127.0.0.1).
+     *
+     * @param inetAddress Any Ipv4 or Ipv6 InetAddress.
+     * @return The converted Ipv4 or Ipv6 IpAddressBinary, or Ipv4 loopback address (127.0.0.1) if null is passed.
+     */
+    public static IpAddressBinary addressBinaryFromInet(InetAddress inetAddress) {
+        if (inetAddress == null) {
+            inetAddress = Inet4Address.getLoopbackAddress();
+        }
+
+        if (inetAddress instanceof Inet4Address) {
+            return new IpAddressBinary(new Ipv4AddressBinary(inetAddress.getAddress()));
+        } else if (inetAddress instanceof Inet6Address) {
+            return new IpAddressBinary(new Ipv6AddressBinary(inetAddress.getAddress()));
+        }
+        return null;
+    }
+
     private static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
             .lisp.address.address.Ipv4Prefix convertFromBinary(Ipv4PrefixBinary prefix) {
         return new Ipv4PrefixBuilder().setIpv4Prefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(
index 3f9351950f32ebb989f38e49d33679480eb1cc04..514e376342071cacf20ec0ad3aa1d1d71b91690a 100644 (file)
@@ -116,6 +116,19 @@ module odl-lisp-proto {
         }
     }
 
+    grouping map-request-metadata {
+        leaf source-rloc {
+            type inet-bin:ip-address-binary;
+            description
+                "The Source IP address used for sending the enclosing control
+                packet in RLOC space.";
+        }
+        description
+            "This is a collection of fields which are not present in the actual
+            mapping record defined in RFC 6830, but are used internally in
+            OpenDaylight";
+    }
+
     grouping mapping-record-metadata {
         leaf xtr-id {
             type xtr-id;
@@ -278,6 +291,7 @@ module odl-lisp-proto {
         container MapReply {
             uses mapping-record-container;
         }
+        uses map-request-metadata;
     }
 
     grouping MapReply {
index 606293acf381e71da4dbd01ed58deb029cc9b3fb..92dcc24ed7473af29b7d13f66b9c32289c49a563 100644 (file)
@@ -54,7 +54,7 @@ public class MapRequestSerializationTest extends BaseTestCase {
     public void deserialize__FlagsInFirstByte() throws Exception {
         MapRequest mr = MapRequestSerializer.getInstance().deserialize(hexToByteBuffer("16 00 00 01 3d 8d "
                 + "2a cd 39 c8 d6 08 00 00 00 01 c0 a8 88 0a 00 20 "
-                + "00 01 01 02 03 04"));
+                + "00 01 01 02 03 04"), null);
         assertFalse(mr.isAuthoritative());
         assertTrue(mr.isMapDataPresent());
         assertTrue(mr.isProbe());
@@ -62,7 +62,7 @@ public class MapRequestSerializationTest extends BaseTestCase {
 
         mr = MapRequestSerializer.getInstance().deserialize(hexToByteBuffer("19 00 00 01 3d 8d "
                 + "2a cd 39 c8 d6 08 00 00 00 01 c0 a8 88 0a 00 20 "
-                + "00 01 01 02 03 04"));
+                + "00 01 01 02 03 04"), null);
         assertTrue(mr.isAuthoritative());
         assertFalse(mr.isMapDataPresent());
         assertFalse(mr.isProbe());
@@ -70,7 +70,7 @@ public class MapRequestSerializationTest extends BaseTestCase {
 
         mr = MapRequestSerializer.getInstance().deserialize(hexToByteBuffer("1C 00 00 01 3d 8d "
                 + "2a cd 39 c8 d6 08 00 00 00 01 c0 a8 88 0a 00 20 "
-                + "00 01 01 02 03 04"));
+                + "00 01 01 02 03 04"), null);
         assertTrue(mr.isAuthoritative());
         assertTrue(mr.isMapDataPresent());
         assertFalse(mr.isProbe());
@@ -83,7 +83,7 @@ public class MapRequestSerializationTest extends BaseTestCase {
                 + "7f 5b 41 7c 77 3c 00 01 01 01 01 01 00 01 c0 a8 "
                 + "38 66 00 20 00 01 01 02 03 04 00 00 00 0a 01 20 "
                 + "10 00 00 00 00 01 01 01 01 01 01 64 ff 00 00 05 "
-                + "00 01 c0 a8 38 66"));
+                + "00 01 c0 a8 38 66"), null);
         assertArrayEquals(new byte[] {1, 1, 1, 1},
                 ((Ipv4Binary) mr.getSourceEid().getEid().getAddress()).getIpv4Binary().getValue());
         assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"), mr.getEidItem().get(0).getEid());
@@ -140,13 +140,13 @@ public class MapRequestSerializationTest extends BaseTestCase {
     public void deserialize__FlagsInSecondByte() throws Exception {
         MapRequest mr = MapRequestSerializer.getInstance().deserialize(hexToByteBuffer("16 80 00 01 3d 8d "
                 + "2a cd 39 c8 d6 08 00 00 00 01 c0 a8 88 0a 00 20 "
-                + "00 01 01 02 03 04"));
+                + "00 01 01 02 03 04"), null);
         assertTrue(mr.isPitr());
         assertFalse(mr.isSmrInvoked());
 
         mr = MapRequestSerializer.getInstance().deserialize(hexToByteBuffer("19 40 00 01 3d 8d "
                 + "2a cd 39 c8 d6 08 00 00 00 01 c0 a8 88 0a 00 20 "
-                + "00 01 01 02 03 04"));
+                + "00 01 01 02 03 04"), null);
         assertFalse(mr.isPitr());
         assertTrue(mr.isSmrInvoked());
     }
@@ -156,7 +156,7 @@ public class MapRequestSerializationTest extends BaseTestCase {
         MapRequest mr = MapRequestSerializer.getInstance().deserialize(hexToByteBuffer("16 80 00 "
                 + "01 " // single record
                 + "3d 8d 2a cd 39 c8 d6 08 00 00 00 01 c0 a8 88 0a "
-                + "00 20 00 01 01 02 03 04"));
+                + "00 20 00 01 01 02 03 04"), null);
 
         assertEquals(1, mr.getEidItem().size());
         assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"), mr.getEidItem().get(0).getEid());
@@ -174,7 +174,7 @@ public class MapRequestSerializationTest extends BaseTestCase {
                 + "03 04 00 06 00 01 0a 0a "
                 + "0a 0a"
 
-        ));
+        ), null);
 
         assertEquals(1, mr.getEidItem().size());
         assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"), mr.getEidItem().get(0).getEid());
@@ -213,7 +213,7 @@ public class MapRequestSerializationTest extends BaseTestCase {
                 + "02 " // 2 records
                 + "3d 8d 2a cd 39 c8 d6 08 00 00 00 01 c0 a8 88 0a " //
                 + "00 20 00 01 01 02 03 04 " //
-                + "00 80 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05"));
+                + "00 80 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05"), null);
 
         assertEquals(2, mr.getEidItem().size());
         assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32"), mr.getEidItem().get(0).getEid());
@@ -238,7 +238,7 @@ public class MapRequestSerializationTest extends BaseTestCase {
                 + "00 " // This means 1 ITR-RLOC
                 + "01 3d 8d 2a cd 39 c8 d6 08 00 00 " //
                 + "00 01 c0 a8 88 0a " // IPv4 (ITR-RLOC #1 of 1)
-                + "00 20 00 01 01 02 03 04"));
+                + "00 20 00 01 01 02 03 04"), null);
 
         assertEquals(1, mr.getItrRloc().size());
         assertArrayEquals(new byte[] {(byte) 192, (byte) 168, (byte) 136, (byte) 10},
@@ -275,7 +275,7 @@ public class MapRequestSerializationTest extends BaseTestCase {
                 // IPv6 (ITR-RLOC #2 of 3)
                 + "00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 " //
                 + "00 01 11 22 34 56 " // IPv4 (ITR-RLOC #3 of 3)
-                + "00 20 00 01 01 02 03 04"));
+                + "00 20 00 01 01 02 03 04"), null);
 
         assertEquals(3, mr.getItrRloc().size());
         assertArrayEquals(new byte[] {(byte) 192, (byte) 168, (byte) 136, (byte) 10},
index 1f7347df5921165e2d379c6e986b9009a2b45809..38793b5b6adcf6523c115b181fe09e0ef088cb60 100644 (file)
@@ -115,7 +115,7 @@ public class LispSouthboundHandler extends SimpleChannelInboundHandler<DatagramP
             handleEncapsulatedControlMessage(inBuffer, msg.sender().getAddress());
         } else if (lispType == MessageType.MapRequest) {
             LOG.trace("Received packet of type Map-Request");
-            handleMapRequest(inBuffer, msg.sender().getPort());
+            handleMapRequest(inBuffer, msg.sender().getAddress(), msg.sender().getPort());
         } else if (lispType == MessageType.MapRegister) {
             LOG.trace("Received packet of type Map-Register");
             handleMapRegister(inBuffer, msg.sender().getAddress(), msg.sender().getPort());
@@ -132,16 +132,16 @@ public class LispSouthboundHandler extends SimpleChannelInboundHandler<DatagramP
 
     private void handleEncapsulatedControlMessage(ByteBuffer inBuffer, InetAddress sourceAddress) {
         try {
-            handleMapRequest(inBuffer, extractEncapsulatedSourcePort(inBuffer));
+            handleMapRequest(inBuffer, sourceAddress, extractEncapsulatedSourcePort(inBuffer));
         } catch (RuntimeException re) {
             throw new LispMalformedPacketException("Couldn't deserialize Map-Request (len="
                     + inBuffer.capacity() + ")", re);
         }
     }
 
-    private void handleMapRequest(ByteBuffer inBuffer, int port) {
+    private void handleMapRequest(ByteBuffer inBuffer, InetAddress sourceAddress, int port) {
         try {
-            MapRequest request = MapRequestSerializer.getInstance().deserialize(inBuffer);
+            MapRequest request = MapRequestSerializer.getInstance().deserialize(inBuffer, sourceAddress);
             InetAddress finalSourceAddress = MapRequestUtil.selectItrRloc(request);
             if (finalSourceAddress == null) {
                 throw new LispMalformedPacketException("Couldn't deserialize Map-Request, no ITR Rloc found!");
index 558af2ab1885a184b58ccc4fbe6f972372f38792..668c116752f283375c71550084cb396bb063e950 100644 (file)
@@ -48,7 +48,7 @@ public class LispXtrSouthboundHandler extends SimpleChannelInboundHandler<Datagr
         Object lispType = MessageType.forValue((int) (ByteUtil.getUnsignedByte(inBuffer, LispMessage.Pos.TYPE) >> 4));
         if (lispType == MessageType.MapRequest) {
             LOG.trace("Received packet of type MapRequest for xTR");
-            handleMapRequest(inBuffer);
+            handleMapRequest(inBuffer, packet.sender().getAddress());
         } else if (lispType ==  MessageType.MapReply){
             LOG.trace("Received packet of type MapReply for xTR");
             handleMapReply(inBuffer);
@@ -57,9 +57,9 @@ public class LispXtrSouthboundHandler extends SimpleChannelInboundHandler<Datagr
         }
     }
 
-    private void handleMapRequest(ByteBuffer inBuffer) {
+    private void handleMapRequest(ByteBuffer inBuffer, InetAddress sourceAddress) {
         try {
-            MapRequest request = MapRequestSerializer.getInstance().deserialize(inBuffer);
+            MapRequest request = MapRequestSerializer.getInstance().deserialize(inBuffer, sourceAddress);
             InetAddress finalSourceAddress = MapRequestUtil.selectItrRloc(request);
             if (finalSourceAddress == null) {
                 throw new LispMalformedPacketException("Couldn't deserialize Map-Request, no ITR Rloc found!");
index a474d1fde5094c57f587079136d9864d1d78d2cb..8aa46aca9aec4c3271d5d95806ee44a84b78e714 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.collect.Lists;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.socket.DatagramPacket;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
@@ -234,8 +235,10 @@ public class LispXtrSouthboundHandlerTest {
 
         byte[] result = Arrays.copyOfRange(buffer.array(),
                 headerLength, headerLength + lispPacketLength);
-        final InetSocketAddress address = new InetSocketAddress(PORT);
-        return new DatagramPacket(Unpooled.copiedBuffer(result), address);
+        final InetAddress inetAddress = null;
+        final InetSocketAddress recipient = new InetSocketAddress(PORT);
+        final InetSocketAddress sender = new InetSocketAddress(inetAddress, PORT);
+        return new DatagramPacket(Unpooled.copiedBuffer(result), recipient, sender);
     }
 
     private static MapRequestBuilder getDefaultMapRequestBuilder() {