use of org.opendaylight.genius.mdsalutil.packet.TCP in project netvirt by opendaylight.
the class NaptPacketInHandler method onPacketReceived.
@Override
// TODO Clean up the exception handling
@SuppressWarnings("checkstyle:IllegalCatch")
public void onPacketReceived(PacketReceived packetReceived) {
String internalIPAddress = "";
int portNumber = 0;
long routerId = 0L;
NAPTEntryEvent.Operation operation = NAPTEntryEvent.Operation.ADD;
NAPTEntryEvent.Protocol protocol;
Short tableId = packetReceived.getTableId().getValue();
LOG.trace("onPacketReceived : packet: {}, tableId {}", packetReceived, tableId);
if (tableId == NwConstants.OUTBOUND_NAPT_TABLE) {
LOG.debug("onPacketReceived : NAPTPacketInHandler Packet for Outbound NAPT Table");
byte[] inPayload = packetReceived.getPayload();
Ethernet ethPkt = new Ethernet();
if (inPayload != null) {
try {
ethPkt.deserialize(inPayload, 0, inPayload.length * NetUtils.NUM_BITS_IN_A_BYTE);
} catch (Exception e) {
LOG.warn("onPacketReceived: Failed to decode Packet", e);
return;
}
if (ethPkt.getPayload() instanceof IPv4) {
IPv4 ipPkt = (IPv4) ethPkt.getPayload();
byte[] ipSrc = Ints.toByteArray(ipPkt.getSourceAddress());
internalIPAddress = NWUtil.toStringIpAddress(ipSrc);
LOG.trace("onPacketReceived : Retrieved internalIPAddress {}", internalIPAddress);
if (ipPkt.getPayload() instanceof TCP) {
TCP tcpPkt = (TCP) ipPkt.getPayload();
portNumber = tcpPkt.getSourcePort();
if (portNumber < 0) {
portNumber = 32767 + portNumber + 32767 + 2;
LOG.trace("onPacketReceived : Retrieved and extracted TCP portNumber {}", portNumber);
}
protocol = NAPTEntryEvent.Protocol.TCP;
LOG.trace("onPacketReceived : Retrieved TCP portNumber {}", portNumber);
} else if (ipPkt.getPayload() instanceof UDP) {
UDP udpPkt = (UDP) ipPkt.getPayload();
portNumber = udpPkt.getSourcePort();
if (portNumber < 0) {
portNumber = 32767 + portNumber + 32767 + 2;
LOG.trace("onPacketReceived : Retrieved and extracted UDP portNumber {}", portNumber);
}
protocol = NAPTEntryEvent.Protocol.UDP;
LOG.trace("onPacketReceived : Retrieved UDP portNumber {}", portNumber);
} else {
LOG.error("onPacketReceived : Incoming Packet is neither TCP or UDP packet");
return;
}
} else {
LOG.error("onPacketReceived : Incoming Packet is not IPv4 packet");
return;
}
if (internalIPAddress != null) {
BigInteger metadata = packetReceived.getMatch().getMetadata().getMetadata();
routerId = MetaDataUtil.getNatRouterIdFromMetadata(metadata);
if (routerId <= 0) {
LOG.error("onPacketReceived : Router ID is invalid");
return;
}
String sourceIPPortKey = routerId + NatConstants.COLON_SEPARATOR + internalIPAddress + NatConstants.COLON_SEPARATOR + portNumber;
NatPacketProcessingState state = incomingPacketMap.get(sourceIPPortKey);
if (state == null) {
state = new NatPacketProcessingState(System.currentTimeMillis(), -1);
incomingPacketMap.put(sourceIPPortKey, state);
LOG.trace("onPacketReceived : Processing new SNAT({}) Packet", sourceIPPortKey);
// send to Event Queue
NAPTEntryEvent naptEntryEvent = new NAPTEntryEvent(internalIPAddress, portNumber, routerId, operation, protocol, packetReceived, false, state);
LOG.info("onPacketReceived : First Packet IN Queue Size : {}", ((ThreadPoolExecutor) firstPacketExecutorService).getQueue().size());
firstPacketExecutorService.execute(() -> naptEventHandler.handleEvent(naptEntryEvent));
} else {
LOG.trace("onPacketReceived : SNAT({}) Packet already processed.", sourceIPPortKey);
NAPTEntryEvent naptEntryEvent = new NAPTEntryEvent(internalIPAddress, portNumber, routerId, operation, protocol, packetReceived, true, state);
LOG.debug("onPacketReceived : Retry Packet IN Queue Size : {}", ((ThreadPoolExecutor) retryPacketExecutorService).getQueue().size());
long firstPacketInTime = state.getFirstPacketInTime();
retryPacketExecutorService.execute(() -> {
if (System.currentTimeMillis() - firstPacketInTime > 4000) {
LOG.error("onPacketReceived : Flow not installed even after 4sec." + "Dropping SNAT ({}) Packet", sourceIPPortKey);
removeIncomingPacketMap(sourceIPPortKey);
return;
}
naptEventHandler.handleEvent(naptEntryEvent);
});
}
} else {
LOG.error("onPacketReceived : Retrived internalIPAddress is NULL");
}
}
} else {
LOG.trace("onPacketReceived : Packet is not from the Outbound NAPT table");
}
}
use of org.opendaylight.genius.mdsalutil.packet.TCP in project netvirt by opendaylight.
the class NaptEventHandler method buildNaptPacketOut.
@SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS")
protected byte[] buildNaptPacketOut(Ethernet etherPkt) {
LOG.debug("removeNatFlows : About to build Napt Packet Out");
if (etherPkt.getPayload() instanceof IPv4) {
byte[] rawPkt;
IPv4 ipPkt = (IPv4) etherPkt.getPayload();
if (ipPkt.getPayload() instanceof TCP || ipPkt.getPayload() instanceof UDP) {
try {
rawPkt = etherPkt.serialize();
return rawPkt;
} catch (PacketException e2) {
LOG.error("failed to build NAPT Packet out ", e2);
return null;
}
} else {
LOG.error("removeNatFlows : Unable to build NaptPacketOut since its neither TCP nor UDP");
return null;
}
}
LOG.error("removeNatFlows : Unable to build NaptPacketOut since its not IPv4 packet");
return null;
}
Aggregations