02903dc140e9741da9d0dd266e158f18f994b694
[lispflowmapping.git] / mappingservice / southbound / src / main / java / org / opendaylight / lispflowmapping / southbound / serializer / address / LispSourceDestLCAFAddressSerializer.java
1 package org.opendaylight.lispflowmapping.southbound.serializer.address;
2
3 import java.nio.ByteBuffer;
4
5 import org.opendaylight.lispflowmapping.southbound.lisp.exception.LispMalformedPacketException;
6 import org.opendaylight.lispflowmapping.type.lisp.address.LispAddress;
7 import org.opendaylight.lispflowmapping.type.lisp.address.LispSourceDestLCAFAddress;
8
9 public class LispSourceDestLCAFAddressSerializer extends LispLCAFAddressSerializer {
10
11     private static final LispSourceDestLCAFAddressSerializer INSTANCE = new LispSourceDestLCAFAddressSerializer();
12
13     // Private constructor prevents instantiation from other classes
14     private LispSourceDestLCAFAddressSerializer() {
15     }
16
17     public static LispSourceDestLCAFAddressSerializer getInstance() {
18         return INSTANCE;
19     }
20
21     @Override
22     public short getLcafLength(LispAddress lispAddress) {
23         LispAddressSerializer srcSerializer = LispAddressSerializerFactory.getSerializer(((LispSourceDestLCAFAddress) lispAddress).getSrcAddress()
24                 .getAfi());
25         LispAddressSerializer dstSerializer = LispAddressSerializerFactory.getSerializer(((LispSourceDestLCAFAddress) lispAddress).getDstAddress()
26                 .getAfi());
27         return (short) (Length.ALL_FIELDS + srcSerializer.getAddressSize(((LispSourceDestLCAFAddress) lispAddress).getSrcAddress()) + dstSerializer
28                 .getAddressSize(((LispSourceDestLCAFAddress) lispAddress).getDstAddress()));
29     }
30
31     @Override
32     public void serialize(ByteBuffer buffer, LispAddress lispAddress) {
33         super.internalSerialize(buffer, lispAddress);
34         LispSourceDestLCAFAddress lispSourceDestLCAFAddress = ((LispSourceDestLCAFAddress) lispAddress);
35         buffer.putShort(lispSourceDestLCAFAddress.getReserved());
36         buffer.put(lispSourceDestLCAFAddress.getSrcMaskLength());
37         buffer.put(lispSourceDestLCAFAddress.getDstMaskLength());
38         LispAddressSerializer srcSerializer = LispAddressSerializerFactory.getSerializer(lispSourceDestLCAFAddress.getSrcAddress().getAfi());
39         if (srcSerializer == null) {
40             throw new LispMalformedPacketException("Unknown AFI type=" + lispSourceDestLCAFAddress.getSrcAddress().getAfi());
41         }
42         srcSerializer.serialize(buffer, lispSourceDestLCAFAddress.getSrcAddress());
43         LispAddressSerializer dstSerializer = LispAddressSerializerFactory.getSerializer(lispSourceDestLCAFAddress.getDstAddress().getAfi());
44         if (dstSerializer == null) {
45             throw new LispMalformedPacketException("Unknown AFI type=" + lispSourceDestLCAFAddress.getDstAddress().getAfi());
46         }
47         dstSerializer.serialize(buffer, lispSourceDestLCAFAddress.getDstAddress());
48     }
49
50     @Override
51     public LispSourceDestLCAFAddress innerDeserialize(ByteBuffer buffer, byte res2, short length) {
52         short res = buffer.getShort();
53         byte srcMaskLength = buffer.get();
54         byte dstMaskLength = buffer.get();
55         LispAddress srcAddress = LispAddressSerializer.getInstance().deserialize(buffer);
56         LispAddress dstAddress = LispAddressSerializer.getInstance().deserialize(buffer);
57
58         return new LispSourceDestLCAFAddress(res2, res, srcMaskLength, dstMaskLength, srcAddress, dstAddress);
59     }
60
61     private interface Length {
62         int SOURCE_MASK_LENGTH = 2;
63         int DEST_MASK_LENGTH = 2;
64         int ALL_FIELDS = SOURCE_MASK_LENGTH + DEST_MASK_LENGTH;
65     }
66 }