Class: Netfilter::Queue

Inherits:
Object
  • Object
show all
Extended by:
FFI::Library
Defined in:
lib/nfqueue.rb

Defined Under Namespace

Modules: CopyMode

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(qnumber, mode = CopyMode::PACKET) ⇒ Queue

Creates a new Queue at slot qnumber.

Raises:



238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# File 'lib/nfqueue.rb', line 238

def initialize(qnumber, mode = CopyMode::PACKET)
    @conn_handle = Queue.nfq_open
    raise QueueError, "nfq_open has failed" if @conn_handle.null?

    if Queue.nfq_unbind_pf(@conn_handle, Socket::AF_INET) < 0
        close
        raise QueueError, "nfq_unbind_pf has failed"
    end
      
    if Queue.nfq_bind_pf(@conn_handle, Socket::AF_INET) < 0
        close
        raise QueueError, "nfq_unbind_pf has failed"
    end

    @qhandle = Queue.nfq_create_queue(@conn_handle, qnumber, method(:callback_handler), nil)
    if @qhandle.null?
        close
        raise QueueError, "nfq_create_queue has failed" if @qhandle.null?
    end

    set_mode(mode)
end

Class Method Details

.create(qnumber, mode = CopyMode::PACKET, &callback) ⇒ Object

Creates a new Queue with the provided callback. The queue will be automatically destroyed at return.



310
311
312
313
314
# File 'lib/nfqueue.rb', line 310

def self.create(qnumber, mode = CopyMode::PACKET, &callback)
    queue = self.new(qnumber, mode)
    queue.process(&callback)
    queue.destroy
end

Instance Method Details

#destroyObject

Close the queue.



301
302
303
304
# File 'lib/nfqueue.rb', line 301

def destroy
    Queue.nfq_destroy_queue(@qhandle)
    close
end

#process(&callback) ⇒ Object

Processes packets in the queue, passing them through the provided callback.

Raises:



286
287
288
289
290
291
292
293
294
295
296
# File 'lib/nfqueue.rb', line 286

def process(&callback)
    @callback = callback

    fd = Queue.nfq_fd(@conn_handle)
    raise QueueError, "nfq_fd has failed" if fd < 0

    io = IO.new(fd)
    while data = io.sysread(4096)
        Queue.nfq_handle_packet(@conn_handle, data, data.size)
    end
end

#set_max_length(len) ⇒ Object

Sets the maximum number of elements in the queue.



275
276
277
278
279
280
281
# File 'lib/nfqueue.rb', line 275

def set_max_length(len)
    if Queue.nfq_set_queue_maxlen(@qhandle, len) < 0
        raise QueueError, "nfq_queue_maxlen has failed"
    end

    self
end

#set_mode(mode, range = 0xffff_ffff) ⇒ Object

Changes the copy mode for the queue.



264
265
266
267
268
269
270
# File 'lib/nfqueue.rb', line 264

def set_mode(mode, range = 0xffff_ffff)
    if Queue.nfq_set_mode(@qhandle, mode, range) < 0
        raise QueueError, "nfq_set_mode has failed"
    end

    self
end