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
,java.io.Closeable
,java.lang.AutoCloseable
public final class PcapWriteHandler extends ChannelDuplexHandler implements java.io.Closeable
PcapWriteHandler
capturesByteBuf
fromSocketChannel
/ServerChannel
orDatagramPacket
and writes it into PcapOutputStream
.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
captureZeroByte
tofalse
.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
PcapWriteHandler.Builder
Builder forPcapWriteHandler
private static class
PcapWriteHandler.ChannelType
-
Nested classes/interfaces inherited from interface io.netty.channel.ChannelHandler
ChannelHandler.Sharable
-
-
Field Summary
Fields Modifier and Type Field Description private boolean
captureZeroByte
true
if we want to capture packets with zero bytes elsefalse
.private PcapWriteHandler.ChannelType
channelType
Type of the channel this handler is registered onprivate java.net.InetSocketAddress
handlerAddr
Address of the receiver of the connectionprivate java.net.InetSocketAddress
initiatorAddr
Address of the initiator of the connectionprivate boolean
isServerPipeline
Set totrue
if this handler is registered on a server pipelineprivate InternalLogger
logger
Logger for logging eventsprivate java.io.OutputStream
outputStream
OutputStream
where we'll write Pcap data.private PcapWriter
pCapWriter
PcapWriter
Instanceprivate int
receiveSegmentNumber
TCP Receiver Segment Number.private int
sendSegmentNumber
TCP Sender Segment Number.private boolean
sharedOutputStream
true
if we want to synchronize on theOutputStream
while writing elsefalse
.private java.util.concurrent.atomic.AtomicReference<State>
state
Current of thisPcapWriteHandler
private boolean
writePcapGlobalHeader
-
Constructor Summary
Constructors Modifier Constructor Description private
PcapWriteHandler(PcapWriteHandler.Builder builder, java.io.OutputStream outputStream)
PcapWriteHandler(java.io.OutputStream outputStream)
Deprecated.UsePcapWriteHandler.Builder
instead.PcapWriteHandler(java.io.OutputStream outputStream, boolean captureZeroByte, boolean writePcapGlobalHeader)
Deprecated.UsePcapWriteHandler.Builder
instead.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static PcapWriteHandler.Builder
builder()
void
channelActive(ChannelHandlerContext ctx)
CallsChannelHandlerContext.fireChannelActive()
to forward to the nextChannelInboundHandler
in theChannelPipeline
.void
channelRead(ChannelHandlerContext ctx, java.lang.Object msg)
CallsChannelHandlerContext.fireChannelRead(Object)
to forward to the nextChannelInboundHandler
in theChannelPipeline
.void
close()
ClosePcapWriter
andOutputStream
.private void
completeTCPWrite(java.net.InetSocketAddress srcAddr, java.net.InetSocketAddress dstAddr, ByteBuf tcpBuf, ByteBufAllocator byteBufAllocator, ChannelHandlerContext ctx)
Write TCP/IP L3 and L2 here.private void
completeUDPWrite(java.net.InetSocketAddress srcAddr, java.net.InetSocketAddress dstAddr, ByteBuf udpBuf, ByteBufAllocator byteBufAllocator, ChannelHandlerContext ctx)
Write UDP/IP L3 and L2 here.void
exceptionCaught(ChannelHandlerContext ctx, java.lang.Throwable cause)
CallsChannelHandlerContext.fireExceptionCaught(Throwable)
to forward to the nextChannelHandler
in theChannelPipeline
.void
handlerRemoved(ChannelHandlerContext ctx)
Do nothing by default, sub-classes may override this method.private void
handleTCP(ChannelHandlerContext ctx, java.lang.Object msg, boolean isWriteOperation)
Handle TCP L4private void
handleUDP(ChannelHandlerContext ctx, java.lang.Object msg)
Handle UDP l4private void
initializeIfNecessary(ChannelHandlerContext ctx)
boolean
isWriting()
Returnstrue
if thePcapWriteHandler
is currently writing packets to theOutputStream
else returnsfalse
.private void
logDiscard()
private void
logTCP(boolean isWriteOperation, int bytes, int sendSegmentNumber, int receiveSegmentNumber, java.net.InetSocketAddress srcAddr, java.net.InetSocketAddress dstAddr, boolean ackOnly)
Logger for TCP(package private) void
markClosed()
(package private) java.io.OutputStream
outputStream()
void
pause()
Pause thePcapWriteHandler
from writing packets to theOutputStream
.(package private) PcapWriter
pCapWriter()
void
resume()
Resume thePcapWriteHandler
to writing packets to theOutputStream
.(package private) boolean
sharedOutputStream()
(package private) State
state()
java.lang.String
toString()
void
write(ChannelHandlerContext ctx, java.lang.Object msg, ChannelPromise promise)
CallsChannelOutboundInvoker.write(Object, ChannelPromise)
to forward to the nextChannelOutboundHandler
in theChannelPipeline
.static void
writeGlobalHeader(java.io.OutputStream outputStream)
Writes the Pcap Global Header to the providedOutputStream
-
Methods inherited from class io.netty.channel.ChannelDuplexHandler
bind, close, connect, deregister, disconnect, flush, read
-
Methods inherited from class io.netty.channel.ChannelInboundHandlerAdapter
channelInactive, channelReadComplete, channelRegistered, channelUnregistered, channelWritabilityChanged, userEventTriggered
-
Methods inherited from class io.netty.channel.ChannelHandlerAdapter
ensureNotSharable, handlerAdded, isSharable
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface io.netty.channel.ChannelHandler
handlerAdded
-
-
-
-
Field Detail
-
logger
private final InternalLogger logger
Logger for logging events
-
pCapWriter
private PcapWriter pCapWriter
PcapWriter
Instance
-
outputStream
private final java.io.OutputStream outputStream
OutputStream
where we'll write Pcap data.
-
captureZeroByte
private final boolean captureZeroByte
true
if we want to capture packets with zero bytes elsefalse
.
-
writePcapGlobalHeader
private final boolean writePcapGlobalHeader
-
sharedOutputStream
private final boolean sharedOutputStream
true
if we want to synchronize on theOutputStream
while writing elsefalse
.
-
sendSegmentNumber
private int sendSegmentNumber
TCP Sender Segment Number. It'll start with 1 and keep incrementing with number of bytes read/sent.
-
receiveSegmentNumber
private int receiveSegmentNumber
TCP Receiver Segment Number. It'll start with 1 and keep incrementing with number of bytes read/sent.
-
channelType
private PcapWriteHandler.ChannelType channelType
Type of the channel this handler is registered on
-
initiatorAddr
private java.net.InetSocketAddress initiatorAddr
Address of the initiator of the connection
-
handlerAddr
private java.net.InetSocketAddress handlerAddr
Address of the receiver of the connection
-
isServerPipeline
private boolean isServerPipeline
Set totrue
if this handler is registered on a server pipeline
-
state
private final java.util.concurrent.atomic.AtomicReference<State> state
Current of thisPcapWriteHandler
-
-
Constructor Detail
-
PcapWriteHandler
@Deprecated public PcapWriteHandler(java.io.OutputStream outputStream)
Deprecated.UsePcapWriteHandler.Builder
instead.Create newPcapWriteHandler
Instance.captureZeroByte
is set tofalse
andwritePcapGlobalHeader
is set totrue
.- Parameters:
outputStream
- OutputStream where Pcap data will be written. Callclose()
to close this OutputStream.- Throws:
java.lang.NullPointerException
- IfOutputStream
isnull
then we'll throw anNullPointerException
-
PcapWriteHandler
@Deprecated public PcapWriteHandler(java.io.OutputStream outputStream, boolean captureZeroByte, boolean writePcapGlobalHeader)
Deprecated.UsePcapWriteHandler.Builder
instead.Create newPcapWriteHandler
Instance- Parameters:
outputStream
- OutputStream where Pcap data will be written. Callclose()
to close this OutputStream.captureZeroByte
- Set totrue
to enable capturing packets with empty (0 bytes) payload. Otherwise, if set tofalse
, empty packets will be filtered out.writePcapGlobalHeader
- Set totrue
to 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:
java.lang.NullPointerException
- IfOutputStream
isnull
then we'll throw anNullPointerException
-
PcapWriteHandler
private PcapWriteHandler(PcapWriteHandler.Builder builder, java.io.OutputStream outputStream)
-
-
Method Detail
-
writeGlobalHeader
public static void writeGlobalHeader(java.io.OutputStream outputStream) throws java.io.IOException
Writes the Pcap Global Header to the providedOutputStream
- Parameters:
outputStream
- OutputStream where Pcap data will be written.- Throws:
java.io.IOException
- if there is an error writing to theOutputStream
-
initializeIfNecessary
private void initializeIfNecessary(ChannelHandlerContext ctx) throws java.lang.Exception
- Throws:
java.lang.Exception
-
channelActive
public void channelActive(ChannelHandlerContext ctx) throws java.lang.Exception
Description copied from class:ChannelInboundHandlerAdapter
CallsChannelHandlerContext.fireChannelActive()
to forward to the nextChannelInboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
channelActive
in interfaceChannelInboundHandler
- Overrides:
channelActive
in classChannelInboundHandlerAdapter
- Throws:
java.lang.Exception
-
channelRead
public void channelRead(ChannelHandlerContext ctx, java.lang.Object msg) throws java.lang.Exception
Description copied from class:ChannelInboundHandlerAdapter
CallsChannelHandlerContext.fireChannelRead(Object)
to forward to the nextChannelInboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
channelRead
in interfaceChannelInboundHandler
- Overrides:
channelRead
in classChannelInboundHandlerAdapter
- Throws:
java.lang.Exception
-
write
public void write(ChannelHandlerContext ctx, java.lang.Object msg, ChannelPromise promise) throws java.lang.Exception
Description copied from class:ChannelDuplexHandler
CallsChannelOutboundInvoker.write(Object, ChannelPromise)
to forward to the nextChannelOutboundHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
write
in interfaceChannelOutboundHandler
- Overrides:
write
in classChannelDuplexHandler
- Parameters:
ctx
- theChannelHandlerContext
for which the write operation is mademsg
- the message to writepromise
- theChannelPromise
to notify once the operation completes- Throws:
java.lang.Exception
- thrown if an error occurs
-
handleTCP
private void handleTCP(ChannelHandlerContext ctx, java.lang.Object msg, boolean isWriteOperation)
Handle TCP L4- Parameters:
ctx
-ChannelHandlerContext
forByteBuf
allocation andfireExceptionCaught
msg
-Object
must beByteBuf
else it'll be discardedisWriteOperation
- Settrue
if we have to process packet when packets are being sent out else setfalse
-
completeTCPWrite
private void completeTCPWrite(java.net.InetSocketAddress srcAddr, java.net.InetSocketAddress dstAddr, ByteBuf tcpBuf, ByteBufAllocator byteBufAllocator, ChannelHandlerContext ctx)
Write TCP/IP L3 and L2 here.- Parameters:
srcAddr
-InetSocketAddress
Source Address of this PacketdstAddr
-InetSocketAddress
Destination Address of this PackettcpBuf
-ByteBuf
containing TCP L4 DatabyteBufAllocator
-ByteBufAllocator
for allocating bytes for TCP/IP L3 and L2 data.ctx
-ChannelHandlerContext
forfireExceptionCaught
-
handleUDP
private void handleUDP(ChannelHandlerContext ctx, java.lang.Object msg)
Handle UDP l4- Parameters:
ctx
-ChannelHandlerContext
forlocalAddress
/remoteAddress
,ByteBuf
allocation andfireExceptionCaught
msg
-DatagramPacket
orByteBuf
-
completeUDPWrite
private void completeUDPWrite(java.net.InetSocketAddress srcAddr, java.net.InetSocketAddress dstAddr, ByteBuf udpBuf, ByteBufAllocator byteBufAllocator, ChannelHandlerContext ctx)
Write UDP/IP L3 and L2 here.- Parameters:
srcAddr
-InetSocketAddress
Source Address of this PacketdstAddr
-InetSocketAddress
Destination Address of this PacketudpBuf
-ByteBuf
containing UDP L4 DatabyteBufAllocator
-ByteBufAllocator
for allocating bytes for UDP/IP L3 and L2 data.ctx
-ChannelHandlerContext
forfireExceptionCaught
-
handlerRemoved
public void handlerRemoved(ChannelHandlerContext ctx) throws java.lang.Exception
Description copied from class:ChannelHandlerAdapter
Do nothing by default, sub-classes may override this method.- Specified by:
handlerRemoved
in interfaceChannelHandler
- Overrides:
handlerRemoved
in classChannelHandlerAdapter
- Throws:
java.lang.Exception
-
exceptionCaught
public void exceptionCaught(ChannelHandlerContext ctx, java.lang.Throwable cause) throws java.lang.Exception
Description copied from class:ChannelInboundHandlerAdapter
CallsChannelHandlerContext.fireExceptionCaught(Throwable)
to forward to the nextChannelHandler
in theChannelPipeline
. Sub-classes may override this method to change behavior.- Specified by:
exceptionCaught
in interfaceChannelHandler
- Specified by:
exceptionCaught
in interfaceChannelInboundHandler
- Overrides:
exceptionCaught
in classChannelInboundHandlerAdapter
- Throws:
java.lang.Exception
-
logTCP
private void logTCP(boolean isWriteOperation, int bytes, int sendSegmentNumber, int receiveSegmentNumber, java.net.InetSocketAddress srcAddr, java.net.InetSocketAddress dstAddr, boolean ackOnly)
Logger for TCP
-
outputStream
java.io.OutputStream outputStream()
-
sharedOutputStream
boolean sharedOutputStream()
-
isWriting
public boolean isWriting()
Returnstrue
if thePcapWriteHandler
is currently writing packets to theOutputStream
else returnsfalse
.
-
state
State state()
-
pause
public void pause()
Pause thePcapWriteHandler
from writing packets to theOutputStream
.
-
resume
public void resume()
Resume thePcapWriteHandler
to writing packets to theOutputStream
.
-
markClosed
void markClosed()
-
pCapWriter
PcapWriter pCapWriter()
-
logDiscard
private void logDiscard()
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
close
public void close() throws java.io.IOException
Close
PcapWriter
andOutputStream
.Note: Calling this method does not close
PcapWriteHandler
. Only Pcap Writes are closed.- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Throws:
java.io.IOException
- IfOutputStream.close()
throws an exception
-
builder
public static PcapWriteHandler.Builder builder()
-
-