/** * Sets the data of this option. * * @param data the data to set */ public void setData(byte[] data) { try { this.payload = Data.deserializer().deserialize(data, 0, data.length); } catch (DeserializationException e) { throw new IllegalArgumentException("Invalid data"); } }
@Override public void setData(byte[] data) { try { Dhcp6Duid duid = Dhcp6Duid.deserializer().deserialize(data, 0, data.length); this.setDuid(duid); } catch (DeserializationException e) { throw new IllegalArgumentException("Invalid DUID"); } }
/** * Deserializer function for IP packets. * * @return deserializer function */ public static Deserializer<? extends IP> deserializer() { return (data, offset, length) -> { final ByteBuffer bb = ByteBuffer.wrap(data, offset, length); byte version = (byte) (bb.get() >> 4 & 0xf); switch (version) { case 4: return IPv4.deserializer().deserialize(data, offset, length); case 6: return IPv6.deserializer().deserialize(data, offset, length); default: throw new DeserializationException("Invalid IP version"); } }; } }
/** * Make an exact copy of the ARP packet. * * @return copy of the packet */ public ARP duplicate() { try { byte[] data = serialize(); return deserializer().deserialize(data, 0, data.length); } catch (DeserializationException dex) { // If we can't make an object out of the serialized data, its a defect throw new IllegalStateException(dex); } }
try { Deserializer deserializer = (Deserializer) deserializerFactory.invoke(this); return deserializer.deserialize(data, 0, data.length); } catch (IllegalAccessException | InvocationTargetException | DeserializationException ex) { throw new IllegalStateException(ex);
/** * Make an exact copy of the ethernet packet. * * @return copy of the packet */ public Ethernet duplicate() { try { byte[] data = serialize(); return deserializer().deserialize(data, 0, data.length); } catch (DeserializationException dex) { // If we can't make an object out of the serialized data, its a defect throw new IllegalStateException(dex); } } }
@Override public Ethernet parsed() { checkPermission(PACKET_READ); try { return Ethernet.deserializer().deserialize(pktin.getData(), 0, pktin.getData().length); } catch (BufferUnderflowException | NullPointerException | DeserializationException e) { Logger log = LoggerFactory.getLogger(getClass()); log.error("packet deserialization problem : {}", e.getMessage()); return null; } }
/** * Returns the deserializer closure (used by upper layer deserializer). * * @return the deserializer closure */ public static Deserializer<VXLAN> deserializer() { return (data, offset, length) -> { checkInput(data, offset, length, VXLAN_HEADER_LENGTH); VXLAN vxlan = new VXLAN(); ByteBuffer bb = ByteBuffer.wrap(data, offset, length); vxlan.flags = bb.get(); bb.get(vxlan.rsvd1); bb.get(vxlan.vni); vxlan.rsvd2 = bb.get(); Deserializer<? extends IPacket> deserializer = Data.deserializer(); vxlan.payload = deserializer.deserialize(data, bb.position(), bb.limit() - bb.position()); vxlan.payload.setParent(vxlan); return vxlan; }; }
/** * Deserializer function for RIPng packets. * * @return deserializer function */ public static Deserializer<RIPng> deserializer() { return (data, offset, length) -> { RIPng ripng = new RIPng(); checkInput(data, offset, length, MIN_HEADER_LENGTH); ByteBuffer bb = ByteBuffer.wrap(data, offset, length); ripng.cmdType = bb.get(); ripng.version = bb.get(); ripng.reserved = bb.getShort(); // read route entries while (bb.hasRemaining() && (bb.remaining() >= RIPngEntry.ENTRY_LEN)) { RIPngEntry rtEntry; byte[] rtData = new byte[RIPngEntry.ENTRY_LEN]; bb.get(rtData); rtEntry = RIPngEntry.deserializer().deserialize(rtData, 0, rtData.length); ripng.rtEntries.add(rtEntry); } return ripng; }; } /*
/** * Deserializer function for encapsulated security payload headers. * * @return deserializer function */ public static Deserializer<EncapSecurityPayload> deserializer() { return (data, offset, length) -> { checkInput(data, offset, length, HEADER_LENGTH); EncapSecurityPayload encapSecurityPayload = new EncapSecurityPayload(); ByteBuffer bb = ByteBuffer.wrap(data, offset, length); encapSecurityPayload.securityParamIndex = bb.getInt(); encapSecurityPayload.sequence = bb.getInt(); encapSecurityPayload.payload = Data.deserializer().deserialize( data, bb.position(), bb.limit() - bb.position()); encapSecurityPayload.payload.setParent(encapSecurityPayload); return encapSecurityPayload; }; }
/** * Deserializer function for UDP packets. * * @return deserializer function */ public static Deserializer<UDP> deserializer() { return (data, offset, length) -> { checkInput(data, offset, length, UDP_HEADER_LENGTH); UDP udp = new UDP(); ByteBuffer bb = ByteBuffer.wrap(data, offset, length); udp.sourcePort = (bb.getShort() & 0xffff); udp.destinationPort = (bb.getShort() & 0xffff); udp.length = bb.getShort(); udp.checksum = bb.getShort(); Deserializer<? extends IPacket> deserializer; if (UDP.PORT_DESERIALIZER_MAP.containsKey(udp.destinationPort)) { deserializer = UDP.PORT_DESERIALIZER_MAP.get(udp.destinationPort); } else if (UDP.PORT_DESERIALIZER_MAP.containsKey(udp.sourcePort)) { deserializer = UDP.PORT_DESERIALIZER_MAP.get(udp.sourcePort); } else { deserializer = Data.deserializer(); } udp.payload = deserializer.deserialize(data, bb.position(), bb.limit() - bb.position()); udp.payload.setParent(udp); return udp; }; }
rip.authEntry = RIPV2AuthEntry.deserializer().deserialize(rtData, 0, rtData.length); RIPV2Entry rtEntry = RIPV2Entry.deserializer().deserialize(rtData, 0, rtData.length); rip.rtEntries.add(rtEntry);
/** * Deserializer function for MPLS packets. * * @return deserializer function */ public static Deserializer<MPLS> deserializer() { return (data, offset, length) -> { checkInput(data, offset, length, HEADER_LENGTH); MPLS mpls = new MPLS(); ByteBuffer bb = ByteBuffer.wrap(data, offset, length); int mplsheader = bb.getInt(); mpls.label = ((mplsheader & 0xfffff000) >>> 12); mpls.bos = (byte) ((mplsheader & 0x00000100) >> 8); mpls.ttl = (byte) (mplsheader & 0x000000ff); mpls.protocol = (mpls.bos == 1) ? PROTOCOL_IPV4 : PROTOCOL_MPLS; Deserializer<? extends IPacket> deserializer; if (protocolDeserializerMap.containsKey(mpls.protocol)) { deserializer = protocolDeserializerMap.get(mpls.protocol); } else { deserializer = Data.deserializer(); } mpls.payload = deserializer.deserialize(data, bb.position(), bb.limit() - bb.position()); mpls.payload.setParent(mpls); return mpls; }; }
/** * Deserializer function for ICMPv6 packets. * * @return deserializer function */ public static Deserializer<ICMP6> deserializer() { return (data, offset, length) -> { checkInput(data, offset, length, HEADER_LENGTH); ICMP6 icmp6 = new ICMP6(); ByteBuffer bb = ByteBuffer.wrap(data, offset, length); icmp6.icmpType = bb.get(); icmp6.icmpCode = bb.get(); icmp6.checksum = bb.getShort(); Deserializer<? extends IPacket> deserializer; if (ICMP6.TYPE_DESERIALIZER_MAP.containsKey(icmp6.icmpType)) { deserializer = TYPE_DESERIALIZER_MAP.get(icmp6.icmpType); } else { deserializer = Data.deserializer(); } icmp6.payload = deserializer.deserialize(data, bb.position(), bb.limit() - bb.position()); icmp6.payload.setParent(icmp6); return icmp6; }; }
/** * Deserializer function for authentication headers. * * @return deserializer function */ public static Deserializer<Authentication> deserializer() { return (data, offset, length) -> { checkInput(data, offset, length, FIXED_HEADER_LENGTH); Authentication authentication = new Authentication(); ByteBuffer bb = ByteBuffer.wrap(data, offset, length); authentication.nextHeader = bb.get(); authentication.payloadLength = bb.get(); bb.getShort(); authentication.securityParamIndex = bb.getInt(); authentication.sequence = bb.getInt(); int icvLength = (authentication.payloadLength + MINUS) * LENGTH_UNIT - FIXED_HEADER_LENGTH; authentication.integrityCheck = new byte[icvLength]; bb.get(authentication.integrityCheck, 0, icvLength); Deserializer<? extends IPacket> deserializer; if (IPv6.PROTOCOL_DESERIALIZER_MAP.containsKey(authentication.nextHeader)) { deserializer = IPv6.PROTOCOL_DESERIALIZER_MAP.get(authentication.nextHeader); } else { deserializer = Data.deserializer(); } authentication.payload = deserializer.deserialize(data, bb.position(), bb.limit() - bb.position()); authentication.payload.setParent(authentication); return authentication; }; }
/** * Deserializer function for fragment headers. * * @return deserializer function */ public static Deserializer<Fragment> deserializer() { return (data, offset, length) -> { checkInput(data, offset, length, HEADER_LENGTH); Fragment fragment = new Fragment(); ByteBuffer bb = ByteBuffer.wrap(data, offset, length); fragment.nextHeader = bb.get(); bb.get(); short sscratch = bb.getShort(); fragment.fragmentOffset = (short) (sscratch >> 3 & 0x1fff); fragment.moreFragment = (byte) (sscratch & 0x1); fragment.identification = bb.getInt(); Deserializer<? extends IPacket> deserializer; if (IPv6.PROTOCOL_DESERIALIZER_MAP.containsKey(fragment.nextHeader)) { deserializer = IPv6.PROTOCOL_DESERIALIZER_MAP.get(fragment.nextHeader); } else { deserializer = Data.deserializer(); } fragment.payload = deserializer.deserialize(data, bb.position(), bb.limit() - bb.position()); fragment.payload.setParent(fragment); return fragment; }; }
/** * Decapsulates an EAP packet from the RADIUS packet. * * @return An EAP object containing the reassembled EAP message * @throws DeserializationException if packet deserialization fails */ public EAP decapsulateMessage() throws DeserializationException { EAP message = new EAP(); ByteArrayOutputStream messageStream = new ByteArrayOutputStream(); // Iterating through EAP-Message attributes to concatenate their value for (RADIUSAttribute ra : this.getAttributeList(RADIUSAttribute.RADIUS_ATTR_EAP_MESSAGE)) { try { messageStream.write(ra.getValue()); } catch (IOException e) { log.error("Error while reassembling EAP message: {}", e.getMessage()); } } // Assembling EAP object from the concatenated stream message = EAP.deserializer().deserialize(messageStream.toByteArray(), 0, messageStream.size()); return message; }
case ICMP.TYPE_ECHO_REPLY: Deserializer<ICMPEcho> deserializer = ICMPEcho.deserializer(); icmp.payload = deserializer.deserialize(data, bb.position(), ICMPEcho.ICMP_ECHO_HEADER_LENGTH); bb.position(bb.position() + ICMPEcho.ICMP_ECHO_HEADER_LENGTH); icmp.payload.setPayload(Data.deserializer().deserialize( data, bb.position(), default: icmp.payload = Data.deserializer() .deserialize(data, bb.position(), bb.limit() - bb.position()); break;
.deserialize(data, bb.position(), bb.limit() - bb.position()); tcp.payload.setParent(tcp); return tcp;
int bytesToRead = (payloadLength <= remainingLength) ? payloadLength : remainingLength; ipv6.payload = deserializer.deserialize(data, bb.position(), bytesToRead); ipv6.payload.setParent(ipv6);