Package io.netty.handler.pcap
Class PcapWriteHandler
java.lang.Object
io.netty.channel.ChannelHandlerAdapter
io.netty.channel.ChannelInboundHandlerAdapter
io.netty.channel.ChannelDuplexHandler
io.netty.handler.pcap.PcapWriteHandler
- All Implemented Interfaces:
ChannelHandler,ChannelInboundHandler,ChannelOutboundHandler,Closeable,AutoCloseable
PcapWriteHandler captures ByteBuf from SocketChannel / ServerChannel
or DatagramPacket and writes it into Pcap OutputStream.
Things to keep in mind when using PcapWriteHandler with TCP:
- Whenever
ChannelInboundHandlerAdapter.channelActive(ChannelHandlerContext)is called, a fake TCP 3-way handshake (SYN, SYN+ACK, ACK) is simulated as new connection in Pcap. - Whenever
ChannelHandlerAdapter.handlerRemoved(ChannelHandlerContext)is called, a fake TCP 3-way handshake (FIN+ACK, FIN+ACK, ACK) is simulated as connection shutdown in Pcap. - Whenever
ChannelInboundHandlerAdapter.exceptionCaught(ChannelHandlerContext, Throwable)is called, a fake TCP RST is sent to simulate connection Reset in Pcap. - ACK is sent each time data is send / received.
- Zero Length Data Packets can cause TCP Double ACK error in Wireshark. To tackle this,
set
captureZeroBytetofalse.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final classBuilder forPcapWriteHandlerprivate static enumprivate static final classNested classes/interfaces inherited from interface io.netty.channel.ChannelHandler
ChannelHandler.Sharable -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final booleantrueif we want to capture packets with zero bytes elsefalse.private PcapWriteHandler.ChannelTypeType of the channel this handler is registered onprivate InetSocketAddressAddress of the receiver of the connectionprivate InetSocketAddressAddress of the initiator of the connectionprivate booleanSet totrueif this handler is registered on a server pipelineprivate final InternalLoggerLogger for logging eventsprivate final OutputStreamOutputStreamwhere we'll write Pcap data.private PcapWriterPcapWriterInstanceprivate longTCP Receiver Segment Number.private longTCP Sender Segment Number.private final booleanprivate final AtomicReference<State> Current of thisPcapWriteHandlerprivate final boolean -
Constructor Summary
ConstructorsModifierConstructorDescriptionprivatePcapWriteHandler(PcapWriteHandler.Builder builder, OutputStream outputStream) PcapWriteHandler(OutputStream outputStream) Deprecated.PcapWriteHandler(OutputStream outputStream, boolean captureZeroByte, boolean writePcapGlobalHeader) Deprecated.UsePcapWriteHandler.Builderinstead. -
Method Summary
Modifier and TypeMethodDescriptionstatic PcapWriteHandler.Builderbuilder()voidCallsChannelHandlerContext.fireChannelActive()to forward to the nextChannelInboundHandlerin theChannelPipeline.voidchannelRead(ChannelHandlerContext ctx, Object msg) CallsChannelHandlerContext.fireChannelRead(Object)to forward to the nextChannelInboundHandlerin theChannelPipeline.voidclose()ClosePcapWriterandOutputStream.private voidcompleteTCPWrite(InetSocketAddress srcAddr, InetSocketAddress dstAddr, ByteBuf tcpBuf, ByteBufAllocator byteBufAllocator, ChannelHandlerContext ctx) Write TCP/IP L3 and L2 here.private voidcompleteUDPWrite(InetSocketAddress srcAddr, InetSocketAddress dstAddr, ByteBuf udpBuf, ByteBufAllocator byteBufAllocator, ChannelHandlerContext ctx) Write UDP/IP L3 and L2 here.voidexceptionCaught(ChannelHandlerContext ctx, Throwable cause) CallsChannelHandlerContext.fireExceptionCaught(Throwable)to forward to the nextChannelHandlerin theChannelPipeline.private static InetSocketAddressgetLocalAddress(Channel ch, InetSocketAddress remote) Get the local address of a channel.voidDo nothing by default, sub-classes may override this method.private voidhandleTCP(ChannelHandlerContext ctx, Object msg, boolean isWriteOperation) Handle TCP L4private voidhandleTcpPacket(ChannelHandlerContext ctx, ByteBuf packet, boolean isWriteOperation, ByteBufAllocator byteBufAllocator) private voidhandleUDP(ChannelHandlerContext ctx, Object msg, boolean isWriteOperation) Handle UDP l4private static longincrementUintSegmentNumber(long sequenceNumber, int value) private voidbooleanReturnstrueif thePcapWriteHandleris currently writing packets to theOutputStreamelse returnsfalse.private voidprivate voidlogTCP(boolean isWriteOperation, int bytes, long sendSegmentNumber, long receiveSegmentNumber, InetSocketAddress srcAddr, InetSocketAddress dstAddr, boolean ackOnly) Logger for TCP(package private) void(package private) OutputStreamvoidpause()Pause thePcapWriteHandlerfrom writing packets to theOutputStream.(package private) PcapWritervoidresume()Resume thePcapWriteHandlerto writing packets to theOutputStream.(package private) boolean(package private) Statestate()toString()voidwrite(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) CallsChannelOutboundInvoker.write(Object, ChannelPromise)to forward to the nextChannelOutboundHandlerin theChannelPipeline.static voidwriteGlobalHeader(OutputStream outputStream) Writes the Pcap Global Header to the providedOutputStream(package private) booleanMethods inherited from class io.netty.channel.ChannelDuplexHandler
bind, close, connect, deregister, disconnect, flush, readMethods inherited from class io.netty.channel.ChannelInboundHandlerAdapter
channelInactive, channelReadComplete, channelRegistered, channelUnregistered, channelWritabilityChanged, userEventTriggeredMethods inherited from class io.netty.channel.ChannelHandlerAdapter
ensureNotSharable, handlerAdded, isSharableMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface io.netty.channel.ChannelHandler
handlerAdded
-
Field Details
-
logger
Logger for logging events -
pCapWriter
PcapWriterInstance -
outputStream
OutputStreamwhere we'll write Pcap data. -
captureZeroByte
private final boolean captureZeroBytetrueif we want to capture packets with zero bytes elsefalse. -
writePcapGlobalHeader
private final boolean writePcapGlobalHeader -
sendSegmentNumber
private long sendSegmentNumberTCP Sender Segment Number. It'll start with 1 and keep incrementing with number of bytes read/sent and wrap at the uint32 max. -
receiveSegmentNumber
private long receiveSegmentNumberTCP Receiver Segment Number. It'll start with 1 and keep incrementing with number of bytes read/sent and wrap at the uint32 max -
channelType
Type of the channel this handler is registered on -
initiatorAddr
Address of the initiator of the connection -
handlerAddr
Address of the receiver of the connection -
isServerPipeline
private boolean isServerPipelineSet totrueif this handler is registered on a server pipeline -
state
Current of thisPcapWriteHandler
-
-
Constructor Details
-
PcapWriteHandler
Deprecated.UsePcapWriteHandler.Builderinstead.Create newPcapWriteHandlerInstance.captureZeroByteis set tofalseandwritePcapGlobalHeaderis set totrue.- Parameters:
outputStream- OutputStream where Pcap data will be written. Callclose()to close this OutputStream.- Throws:
NullPointerException- IfOutputStreamisnullthen we'll throw anNullPointerException
-
PcapWriteHandler
@Deprecated public PcapWriteHandler(OutputStream outputStream, boolean captureZeroByte, boolean writePcapGlobalHeader) Deprecated.UsePcapWriteHandler.Builderinstead.Create newPcapWriteHandlerInstance- Parameters:
outputStream- OutputStream where Pcap data will be written. Callclose()to close this OutputStream.captureZeroByte- Set totrueto enable capturing packets with empty (0 bytes) payload. Otherwise, if set tofalse, empty packets will be filtered out.writePcapGlobalHeader- Set totrueto write Pcap Global Header on initialization. Otherwise, if set tofalse, Pcap Global Header will not be written on initialization. This could when writing Pcap data on a existing file where Pcap Global Header is already present.- Throws:
NullPointerException- IfOutputStreamisnullthen we'll throw anNullPointerException
-
PcapWriteHandler
-
-
Method Details
-
writeGlobalHeader
Writes the Pcap Global Header to the providedOutputStream- Parameters:
outputStream- OutputStream where Pcap data will be written.- Throws:
IOException- if there is an error writing to theOutputStream
-
initializeIfNecessary
- Throws:
Exception
-
channelActive
Description copied from class:ChannelInboundHandlerAdapterCallsChannelHandlerContext.fireChannelActive()to forward to the nextChannelInboundHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
channelActivein interfaceChannelInboundHandler- Overrides:
channelActivein classChannelInboundHandlerAdapter- Throws:
Exception
-
channelRead
Description copied from class:ChannelInboundHandlerAdapterCallsChannelHandlerContext.fireChannelRead(Object)to forward to the nextChannelInboundHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
channelReadin interfaceChannelInboundHandler- Overrides:
channelReadin classChannelInboundHandlerAdapter- Throws:
Exception
-
write
Description copied from class:ChannelDuplexHandlerCallsChannelOutboundInvoker.write(Object, ChannelPromise)to forward to the nextChannelOutboundHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
writein interfaceChannelOutboundHandler- Overrides:
writein classChannelDuplexHandler- Parameters:
ctx- theChannelHandlerContextfor which the write operation is mademsg- the message to writepromise- theChannelPromiseto notify once the operation completes- Throws:
Exception- thrown if an error occurs
-
handleTCP
Handle TCP L4- Parameters:
ctx-ChannelHandlerContextforByteBufallocation andfireExceptionCaughtmsg-Objectmust beByteBufelse it'll be discardedisWriteOperation- Settrueif we have to process packet when packets are being sent out else setfalse
-
handleTcpPacket
private void handleTcpPacket(ChannelHandlerContext ctx, ByteBuf packet, boolean isWriteOperation, ByteBufAllocator byteBufAllocator) -
completeTCPWrite
private void completeTCPWrite(InetSocketAddress srcAddr, InetSocketAddress dstAddr, ByteBuf tcpBuf, ByteBufAllocator byteBufAllocator, ChannelHandlerContext ctx) Write TCP/IP L3 and L2 here.- Parameters:
srcAddr-InetSocketAddressSource Address of this PacketdstAddr-InetSocketAddressDestination Address of this PackettcpBuf-ByteBufcontaining TCP L4 DatabyteBufAllocator-ByteBufAllocatorfor allocating bytes for TCP/IP L3 and L2 data.ctx-ChannelHandlerContextforfireExceptionCaught
-
incrementUintSegmentNumber
private static long incrementUintSegmentNumber(long sequenceNumber, int value) -
handleUDP
Handle UDP l4- Parameters:
ctx-ChannelHandlerContextforlocalAddress/remoteAddress,ByteBufallocation andfireExceptionCaughtmsg-DatagramPacketorByteBuf
-
completeUDPWrite
private void completeUDPWrite(InetSocketAddress srcAddr, InetSocketAddress dstAddr, ByteBuf udpBuf, ByteBufAllocator byteBufAllocator, ChannelHandlerContext ctx) Write UDP/IP L3 and L2 here.- Parameters:
srcAddr-InetSocketAddressSource Address of this PacketdstAddr-InetSocketAddressDestination Address of this PacketudpBuf-ByteBufcontaining UDP L4 DatabyteBufAllocator-ByteBufAllocatorfor allocating bytes for UDP/IP L3 and L2 data.ctx-ChannelHandlerContextforfireExceptionCaught
-
getLocalAddress
Get the local address of a channel. If the address is a wildcard address (0.0.0.0or::), and the address family does not match that of theremote, return the wildcard address of theremote's family instead.- Parameters:
ch- The channel to get the local address fromremote- The remote address- Returns:
- The fixed local address
-
handlerRemoved
Description copied from class:ChannelHandlerAdapterDo nothing by default, sub-classes may override this method.- Specified by:
handlerRemovedin interfaceChannelHandler- Overrides:
handlerRemovedin classChannelHandlerAdapter- Throws:
Exception
-
exceptionCaught
Description copied from class:ChannelInboundHandlerAdapterCallsChannelHandlerContext.fireExceptionCaught(Throwable)to forward to the nextChannelHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
exceptionCaughtin interfaceChannelHandler- Specified by:
exceptionCaughtin interfaceChannelInboundHandler- Overrides:
exceptionCaughtin classChannelInboundHandlerAdapter- Throws:
Exception
-
logTCP
private void logTCP(boolean isWriteOperation, int bytes, long sendSegmentNumber, long receiveSegmentNumber, InetSocketAddress srcAddr, InetSocketAddress dstAddr, boolean ackOnly) Logger for TCP -
outputStream
OutputStream outputStream() -
writePcapGlobalHeader
boolean writePcapGlobalHeader() -
isWriting
public boolean isWriting()Returnstrueif thePcapWriteHandleris currently writing packets to theOutputStreamelse returnsfalse. -
state
State state() -
pause
public void pause()Pause thePcapWriteHandlerfrom writing packets to theOutputStream. -
resume
public void resume()Resume thePcapWriteHandlerto writing packets to theOutputStream. -
markClosed
void markClosed() -
pCapWriter
PcapWriter pCapWriter() -
logDiscard
private void logDiscard() -
toString
-
close
Close
PcapWriterandOutputStream.Note: Calling this method does not close
PcapWriteHandler. Only Pcap Writes are closed.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Throws:
IOException- IfOutputStream.close()throws an exception
-
builder
-
PcapWriteHandler.Builderinstead.