Compare commits

..

9 Commits

Author SHA1 Message Date
Patrick J Cherry
ff565e1dd3 New upstream release 2013-11-13 16:16:25 +00:00
Patrick J Cherry
25cf355fc3 Added tag 0.12-1+squeeze1 for changeset fac5948fd32c 2013-09-12 14:31:28 +01:00
Patrick J Cherry
d4eeb977ce New upstream release 2013-09-12 14:28:35 +01:00
Patrick J Cherry
c0263e83d0 merge 2013-07-16 16:52:27 +01:00
Patrick J Cherry
2251b116ce merge 2013-07-16 16:45:29 +01:00
Patrick J Cherry
e27f54116e Foo 2013-07-16 16:28:40 +01:00
Patrick J Cherry
7195d7b24e arse 2013-07-16 16:36:19 +01:00
Patrick J Cherry
eeb55fa103 Added tag 0.11-1+squeeze1 for changeset 6993fdccebef 2013-07-05 14:02:25 +01:00
Patrick J Cherry
9c7e3a1a96 Updated hgignore for squeeze packages 2013-07-05 13:59:40 +01:00
19 changed files with 394 additions and 633 deletions

View File

@@ -1,43 +0,0 @@
stages:
- package
- publish
package:jessie:gem:
image: $CI_REGISTRY/docker-images/layers:$DISTRO-ruby
stage: package
variables:
DISTRO: jessie
GEMFILE: netlinkrb.gemspec
script:
- package
artifacts:
paths:
- pkg/
package:jessie: &package
image: $CI_REGISTRY/docker-images/layers:$DISTRO-deb
stage: package
variables:
DISTRO: jessie
script:
- package
artifacts:
paths:
- pkg/
package:stretch:
<<: *package
variables:
DISTRO: stretch
package:wheezy:
<<: *package
variables:
DISTRO: wheezy
publish:
image: $CI_REGISTRY/docker-images/layers:jessie-publish
stage: publish
script:
- publish

View File

@@ -1,7 +1,6 @@
^debian/ruby-linux-netlink$ ^debian/liblinux-netlink-ruby(1.8|1.9.1)?$
~$ ~$
^.config-liblinux-netlink-ruby ^.config-liblinux-netlink-ruby
^.pc/
^debian/files$ ^debian/files$
^debian/.*\.substvars$ ^debian/.*\.substvars$
^debian/.*\.debhelper.log$ ^debian/.*\.debhelper.log$

76
debian/changelog vendored
View File

@@ -1,82 +1,20 @@
ruby-linux-netlink (0.19-1) stable; urgency=medium linux-netlink-ruby (0.13-1+squeeze1) oldstable; urgency=low
* The size of size_t is now calculated from the size of an unsigned long
int, instead of calling gcc.
-- Patrick J Cherry <patrick@bytemark.co.uk> Wed, 10 May 2017 15:24:42 +0100
ruby-linux-netlink (0.18-2) stable; urgency=medium
* This package is now architecture independent.
* The source format has been removed in favour of using dh --with quilt.
-- Patrick J Cherry <patrick@bytemark.co.uk> Tue, 28 Feb 2017 16:43:43 +0000
ruby-linux-netlink (0.18-1+jessie1) stable; urgency=medium
* Fixed new massive IP test thing to work with ruby1.8 and also non-root users
* Make sure link exists before proceeding with test
* Scaled back the massive allocation of IPs from 11 /24s to 4.
* Updated linux header constants
* Updated to 0.18
-- Patrick J Cherry <patrick@bytemark.co.uk> Mon, 17 Oct 2016 13:09:35 +0100
ruby-linux-netlink (0.17-1+jessie1) testing; urgency=medium
* New upstream release
-- Patrick J Cherry <patrick@bytemark.co.uk> Wed, 01 Apr 2015 22:51:34 +0100
ruby-linux-netlink (0.16-1+jessie1) testing; urgency=medium
* Repackaged for jessie
-- Patrick J Cherry <patrick@bytemark.co.uk> Wed, 01 Apr 2015 17:39:44 +0100
ruby-linux-netlink (0.16-1+wheezy1) stable; urgency=medium
* New upstream release. * New upstream release.
-- Patrick J Cherry <patch@dynamo> Tue, 26 Aug 2014 16:33:48 +0100 -- Patrick J Cherry <patrick@bytemark.co.uk> Wed, 13 Nov 2013 16:15:43 +0000
ruby-linux-netlink (0.15-1+wheezy1) stable; urgency=low linux-netlink-ruby (0.12-1+squeeze1) oldstable; urgency=low
* New upstream release. * New upstream release.
-- Patrick J Cherry <patrick@bytemark.co.uk> Tue, 21 Jan 2014 10:01:20 +0000 -- Patrick J Cherry <patrick@bytemark.co.uk> Thu, 12 Sep 2013 14:28:10 +0100
ruby-linux-netlink (0.14-1+wheezy1) stable; urgency=low linux-netlink-ruby (0.11-1+squeeze1) oldstable; urgency=low
* New upstream release. * New upstream version.
-- Patrick J Cherry <patrick@bytemark.co.uk> Thu, 14 Nov 2013 13:37:28 +0000 -- Patrick J Cherry <patrick@bytemark.co.uk> Fri, 05 Jul 2013 13:52:09 +0100
ruby-linux-netlink (0.13-1+wheezy1) stable; urgency=low
* New upstream release.
-- Patrick J Cherry <patrick@bytemark.co.uk> Wed, 13 Nov 2013 16:16:36 +0000
ruby-linux-netlink (0.12-1+wheezy1) stable; urgency=low
* New upstream release.
-- Patrick J Cherry <patrick@bytemark.co.uk> Thu, 12 Sep 2013 14:26:41 +0100
ruby-linux-netlink (0.11-1+wheezy2) stable; urgency=low
* Switch to dpkg-source 3.0 (quilt) format.
* Added patch to remove rubygems requires.
* Renamed source package to fit in with the new guidelines.
-- Patrick J Cherry <patrick@bytemark.co.uk> Fri, 05 Jul 2013 14:16:30 +0100
linux-netlink-ruby (0.11-1+wheezy1) stable; urgency=low
* New upstream version, repackaged for wheezy.
-- Patrick J Cherry <patrick@bytemark.co.uk> Fri, 05 Jul 2013 14:16:05 +0100
linux-netlink-ruby (0.10-6) stable; urgency=low linux-netlink-ruby (0.10-6) stable; urgency=low

35
debian/control vendored
View File

@@ -1,18 +1,39 @@
Source: ruby-linux-netlink Source: linux-netlink-ruby
Maintainer: Matthew Bloch <matthew@bytemark.co.uk> Maintainer: Matthew Bloch <matthew@bytemark.co.uk>
Uploaders: Patrick J Cherry <patrick@bytemark.co.uk> Uploaders: Patrick J Cherry <patrick@bytemark.co.uk>
Section: ruby Section: ruby
Priority: optional Priority: optional
Build-Depends: debhelper (>= 7), gem2deb, rake, ruby-ffi, quilt Build-Depends: debhelper (>= 7), cdbs, ruby1.8, ruby1.9.1, ruby-pkg-tools, rake
Standards-Version: 3.8.0 Standards-Version: 3.8.0
XS-Ruby-Versions: all
Package: ruby-linux-netlink Package: liblinux-netlink-ruby
Architecture: all Architecture: all
Depends: ruby | ruby-interpreter, ruby-ffi, ${misc:Depends} Depends: liblinux-netlink-ruby1.8 | liblinux-netlink-ruby1.9.1, ${misc:Depends}
Provides: liblinux-netlink-ruby1.8, liblinux-netlink-ruby1.9.1
XB-Ruby-Versions: ${ruby:Versions}
Description: Netlink socket library for Ruby Description: Netlink socket library for Ruby
This library provides an API for using a Linux Netlink socket, for doing This library provides an API for using a Linux Netlink socket, for doing
things like manipulating IP interfaces and routes programmatically, and things like manipulating IP interfaces and routes programmatically, and
capturing packets from ULOG. capturing packets from ULOG.
.
This is the metapackage for all versions of Ruby.
Package: liblinux-netlink-ruby1.8
Architecture: any
Depends: ruby1.8 (>= 1.8.7), libffi-ruby1.8, ${misc:Depends}
Description: Netlink socket library for Ruby 1.8
This library provides an API for using a Linux Netlink socket, for doing
things like manipulating IP interfaces and routes programmatically, and
capturing packets from ULOG.
.
This is the version for Ruby 1.8.7.
Package: liblinux-netlink-ruby1.9.1
Architecture: any
Depends: ruby1.9.1, libffi-ruby1.9.1, ${misc:Depends}
Description: Netlink socket library for Ruby 1.9.1
This library provides an API for using a Linux Netlink socket, for doing
things like manipulating IP interfaces and routes programmatically, and
capturing packets from ULOG.
.
This is the version for Ruby 1.9.1.

View File

@@ -0,0 +1 @@
examples/*

View File

@@ -1,32 +0,0 @@
Removed "require rubygems" from everywhere.
--- a/lib/linux/iptables.rb
+++ b/lib/linux/iptables.rb
@@ -1,11 +1,6 @@
require 'socket'
require 'linux/constants'
-
-begin
- require 'ffi'
-rescue LoadError
- require('rubygems') ? retry : raise
-end
+require 'ffi'
# Good things about FFI::Struct:
--- a/lib/linux/sendmsg.rb
+++ b/lib/linux/sendmsg.rb
@@ -1,12 +1,7 @@
# Patchup to add Socket#sendmsg and Socket#recvmsg for ruby 1.8
if BasicSocket.instance_methods.grep(/^sendmsg$/).empty?
- begin
- require 'ffi'
- rescue LoadError
- require('rubygems') ? retry : raise
- end
-
+ require 'ffi'
class BasicSocket
module FFIExt

View File

@@ -1 +0,0 @@
remove-rubygems-requirements

View File

@@ -1,2 +0,0 @@
---
- test/t_route.rb

20
debian/rules vendored
View File

@@ -1,23 +1,11 @@
#!/usr/bin/make -f #!/usr/bin/make -f
# #
# export DH_VERBOSE=1
#
# Uncomment to ignore all test failures (but the tests will run anyway)
# export DH_RUBY_IGNORE_TESTS=all
#
# Uncomment to ignore some test failures (but the tests will run anyway).
# Valid values:
# export DH_RUBY_IGNORE_TESTS=ruby1.8 ruby1.9.1 require-rubygems
#
# If you need to specify the .gemspec (eg there is more than one)
# export DH_RUBY_GEMSPEC=gem.gemspec
%: include /usr/share/cdbs/1/rules/debhelper.mk
dh $@ --buildsystem=ruby --with ruby --with quilt include /usr/share/ruby-pkg-tools/1/class/ruby-setup-rb.mk
override_dh_auto_build-arch: makebuilddir::
rake lib/linux/c_struct_sizeof_size_t.rb rake lib/linux/c_struct_sizeof_size_t.rb
override_dh_auto_clean: clean::
rake clean rake clean

View File

@@ -32,12 +32,12 @@ class CStruct
EMPTY_ARRAY = [].freeze #:nodoc: EMPTY_ARRAY = [].freeze #:nodoc:
TYPE_INFO = {} #:nodoc TYPE_INFO = {} #:nodoc
# The size of the structure (in bytes) # The size of the structure (in bytes)
def self.bytesize def self.bytesize
@bytesize @bytesize
end end
# Define a new type for use with 'field'. You supply the # Define a new type for use with 'field'. You supply the
# symbolic name for the type, and a set of options. # symbolic name for the type, and a set of options.
# :pattern => "str" # format string for Array#pack / String#unpack # :pattern => "str" # format string for Array#pack / String#unpack
@@ -51,7 +51,7 @@ class CStruct
def self.define_type(name, opt) def self.define_type(name, opt)
TYPE_INFO[name] = opt TYPE_INFO[name] = opt
end end
# Return a type info hash given a type id. Raises IndexError if not found. # Return a type info hash given a type id. Raises IndexError if not found.
def self.find_type(type) def self.find_type(type)
case type case type
@@ -61,7 +61,7 @@ class CStruct
TYPE_INFO.fetch(type) TYPE_INFO.fetch(type)
end end
end end
define_type :uchar, :pattern => "C" define_type :uchar, :pattern => "C"
define_type :uint16, :pattern => "S", :align => true define_type :uint16, :pattern => "S", :align => true
define_type :uint32, :pattern => "L", :align => true define_type :uint32, :pattern => "L", :align => true
@@ -78,12 +78,12 @@ class CStruct
define_type :long, :pattern => "l_", :align => true define_type :long, :pattern => "l_", :align => true
define_type :ns, :pattern => "n", :align => true define_type :ns, :pattern => "n", :align => true
define_type :nl, :pattern => "N", :align => true define_type :nl, :pattern => "N", :align => true
begin begin
require 'linux/c_struct_sizeof_size_t.rb' require 'linux/c_struct_sizeof_size_t.rb'
rescue LoadError rescue LoadError
warn "netlinkrb: Assuming size_t is a long unsigned int." if $DEBUG warn "Falling back to gcc to determine sizeof size_t." if $VERBOSE
SIZEOF_SIZE_T = [0].pack("L_").bytesize SIZEOF_SIZE_T = Integer(`echo __SIZEOF_SIZE_T__ | gcc -E -P -`) rescue 1.size
end end
define_type :size_t, define_type :size_t,
@@ -108,20 +108,20 @@ class CStruct
h.each { |k,v| self[k] = v } if h h.each { |k,v| self[k] = v } if h
end end
end end
# This hook is called after unpacking from binary, and can be used # This hook is called after unpacking from binary, and can be used
# for fixing up the data # for fixing up the data
def after_parse def after_parse
end end
def to_hash def to_hash
@attrs @attrs
end end
def each(&blk) def each(&blk)
@attrs.each(&blk) @attrs.each(&blk)
end end
# Set a field by name. Currently can use either symbol or string as key. # Set a field by name. Currently can use either symbol or string as key.
def []=(k,v) def []=(k,v)
send "#{k}=", v send "#{k}=", v
@@ -131,7 +131,7 @@ class CStruct
def [](k) def [](k)
@attrs[k] @attrs[k]
end end
def self.inherited(subclass) #:nodoc: def self.inherited(subclass) #:nodoc:
subclass.const_set(:FIELDS, []) subclass.const_set(:FIELDS, [])
subclass.const_set(:FORMAT, "") subclass.const_set(:FORMAT, "")
@@ -175,7 +175,7 @@ class CStruct
@bytesize += count @bytesize += count
end end
end end
# Returns the packed binary representation of this structure # Returns the packed binary representation of this structure
def to_str def to_str
self.class::FIELDS.map { |key| self[key] || self.class::DEFAULTS[key] }.pack(self.class::FORMAT) self.class::FIELDS.map { |key| self[key] || self.class::DEFAULTS[key] }.pack(self.class::FORMAT)
@@ -184,7 +184,7 @@ class CStruct
def inspect def inspect
"#<#{self.class} #{@attrs.inspect}>" "#<#{self.class} #{@attrs.inspect}>"
end end
# Convert a binary representation of this structure into an object instance. # Convert a binary representation of this structure into an object instance.
# If a block is given, the object is yielded to that block. Finally the # If a block is given, the object is yielded to that block. Finally the
# after_parse hook is called. # after_parse hook is called.

View File

@@ -1,136 +1,129 @@
require 'socket' require 'socket'
class Socket class Socket
# From bits/socket.h # From bits/socket.h
PF_NETLINK = 16 unless defined? Socket::PF_NETLINK PF_NETLINK = 16 unless defined? Socket::PF_NETLINK
AF_NETLINK = PF_NETLINK unless defined? Socket::AF_NETLINK AF_NETLINK = PF_NETLINK unless defined? Socket::AF_NETLINK
# From in.h # From in.h
IPPROTO_IPV6 = 41 unless defined? Socket::IPPROTO_IPV6 IPPROTO_IPV6 = 41 unless defined? Socket::IPPROTO_IPV6
end end
module Linux module Linux
# From linux/netlink.h # From linux/netlink.h
NETLINK_ROUTE = 0 NETLINK_ROUTE = 0
NETLINK_UNUSED = 1 NETLINK_UNUSED = 1
NETLINK_USERSOCK = 2 NETLINK_USERSOCK = 2
NETLINK_FIREWALL = 3 NETLINK_FIREWALL = 3
NETLINK_INET_DIAG = 4 NETLINK_INET_DIAG = 4
NETLINK_NFLOG = 5 NETLINK_NFLOG = 5
NETLINK_XFRM = 6 NETLINK_XFRM = 6
NETLINK_SELINUX = 7 NETLINK_SELINUX = 7
NETLINK_ISCSI = 8 NETLINK_ISCSI = 8
NETLINK_AUDIT = 9 NETLINK_AUDIT = 9
NETLINK_FIB_LOOKUP = 10 NETLINK_FIB_LOOKUP = 10
NETLINK_CONNECTOR = 11 NETLINK_CONNECTOR = 11
NETLINK_NETFILTER = 12 NETLINK_NETFILTER = 12
NETLINK_IP6_FW = 13 NETLINK_IP6_FW = 13
NETLINK_DNRTMSG = 14 NETLINK_DNRTMSG = 14
NETLINK_KOBJECT_UEVENT = 15 NETLINK_KOBJECT_UEVENT = 15
NETLINK_GENERIC = 16 NETLINK_GENERIC = 16
NETLINK_SCSITRANSPORT = 18 NETLINK_SCSITRANSPORT = 18
NETLINK_ECRYPTFS = 19 NETLINK_ECRYPTFS = 19
NETLINK_RDMA = 20 NETLINK_RDMA = 20
NETLINK_CRYPTO = 21 NETLINK_CRYPTO = 21
NLM_F_REQUEST = 1 NLM_F_REQUEST = 1
NLM_F_MULTI = 2 NLM_F_MULTI = 2
NLM_F_ACK = 4 NLM_F_ACK = 4
NLM_F_ECHO = 8 NLM_F_ECHO = 8
NLM_F_DUMP_INTR = 16 NLM_F_DUMP_INTR = 16
NLM_F_DUMP_FILTERED = 32 NLM_F_ROOT = 0x100
NLM_F_ROOT = 0x100 NLM_F_MATCH = 0x200
NLM_F_MATCH = 0x200 NLM_F_ATOMIC = 0x400
NLM_F_ATOMIC = 0x400 NLM_F_DUMP = (NLM_F_ROOT|NLM_F_MATCH)
NLM_F_DUMP = (NLM_F_ROOT|NLM_F_MATCH)
NLM_F_REPLACE = 0x100 NLM_F_REPLACE = 0x100
NLM_F_EXCL = 0x200 NLM_F_EXCL = 0x200
NLM_F_CREATE = 0x400 NLM_F_CREATE = 0x400
NLM_F_APPEND = 0x800 NLM_F_APPEND = 0x800
NLMSG_ALIGNTO = 4 # same on i686 and x86_64 NLMSG_ALIGNTO = 4 # same on i686 and x86_64
NLMSG_NOOP = 0x1 NLMSG_NOOP = 0x1
NLMSG_ERROR = 0x2 NLMSG_ERROR = 0x2
NLMSG_DONE = 0x3 NLMSG_DONE = 0x3
NLMSG_OVERRUN = 0x4 NLMSG_OVERRUN = 0x4
NLMSG_MIN_TYPE = 0x10 NETLINK_ADD_MEMBERSHIP = 1
NETLINK_DROP_MEMBERSHIP = 2
NETLINK_ADD_MEMBERSHIP = 1 NETLINK_PKTINFO = 3
NETLINK_DROP_MEMBERSHIP = 2 NETLINK_BROADCAST_ERROR = 4
NETLINK_PKTINFO = 3 NETLINK_NO_ENOBUFS = 5
NETLINK_BROADCAST_ERROR = 4 NETLINK_RX_RING = 6
NETLINK_NO_ENOBUFS = 5
NETLINK_RX_RING = 6
NETLINK_TX_RING = 7 NETLINK_TX_RING = 7
NETLINK_LISTEN_ALL_NSID = 8
NETLINK_LIST_MEMBERSHIPS = 9
NETLINK_CAP_ACK = 10
NETLINK_UNCONNECTED = 0 NETLINK_UNCONNECTED = 0
NETLINK_CONNECTED = 1 NETLINK_CONNECTED = 1
NLA_F_NESTED = (1 << 15) NLA_F_NESTED = (1 << 15)
NLA_F_NET_BYTEORDER = (1 << 14) NLA_F_NET_BYTEORDER = (1 << 14)
NLA_TYPE_MASK = ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) NLA_TYPE_MASK = ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)
NLA_ALIGNTO = 4 # same on i686 and x86_64 NLA_ALIGNTO = 4 # same on i686 and x86_64
# from linux/rtnetlink.h. # from linux/rtnetlink.h.
RTM_BASE = 16 RTM_NEWLINK = 16
RTM_NEWLINK = 16 RTM_DELLINK = 17
RTM_DELLINK = 17 RTM_GETLINK = 18
RTM_GETLINK = 18 RTM_SETLINK = 19
RTM_SETLINK = 19
RTM_NEWADDR = 20 RTM_NEWADDR = 20
RTM_DELADDR = 21 RTM_DELADDR = 21
RTM_GETADDR = 22 RTM_GETADDR = 22
RTM_NEWROUTE = 24 RTM_NEWROUTE = 24
RTM_DELROUTE = 25 RTM_DELROUTE = 25
RTM_GETROUTE = 26 RTM_GETROUTE = 26
RTM_NEWNEIGH = 28 RTM_NEWNEIGH = 28
RTM_DELNEIGH = 29 RTM_DELNEIGH = 29
RTM_GETNEIGH = 30 RTM_GETNEIGH = 30
RTM_NEWRULE = 32 RTM_NEWRULE = 32
RTM_DELRULE = 33 RTM_DELRULE = 33
RTM_GETRULE = 34 RTM_GETRULE = 34
RTM_NEWQDISC = 36 RTM_NEWQDISC = 36
RTM_DELQDISC = 37 RTM_DELQDISC = 37
RTM_GETQDISC = 38 RTM_GETQDISC = 38
RTM_NEWTCLASS = 40 RTM_NEWTCLASS = 40
RTM_DELTCLASS = 41 RTM_DELTCLASS = 41
RTM_GETTCLASS = 42 RTM_GETTCLASS = 42
RTM_NEWTFILTER = 44 RTM_NEWTFILTER = 44
RTM_DELTFILTER = 45 RTM_DELTFILTER = 45
RTM_GETTFILTER = 46 RTM_GETTFILTER = 46
RTM_NEWACTION = 48 RTM_NEWACTION = 48
RTM_DELACTION = 49 RTM_DELACTION = 49
RTM_GETACTION = 50 RTM_GETACTION = 50
RTM_NEWPREFIX = 52 RTM_NEWPREFIX = 52
RTM_GETMULTICAST = 58 RTM_GETMULTICAST = 58
RTM_GETANYCAST = 62 RTM_GETANYCAST = 62
RTM_NEWNEIGHTBL = 64 RTM_NEWNEIGHTBL = 64
RTM_GETNEIGHTBL = 66 RTM_GETNEIGHTBL = 66
RTM_SETNEIGHTBL = 67 RTM_SETNEIGHTBL = 67
RTM_NEWNDUSEROPT = 68 RTM_NEWNDUSEROPT = 68
RTM_NEWADDRLABEL = 72 RTM_NEWADDRLABEL = 72
RTM_DELADDRLABEL = 73 RTM_DELADDRLABEL = 73
RTM_GETADDRLABEL = 74 RTM_GETADDRLABEL = 74
RTM_GETDCB = 78 RTM_GETDCB = 78
RTM_SETDCB = 79 RTM_SETDCB = 79
RTM_NEWNETCONF = 80 RTM_NEWNETCONF = 80
@@ -140,144 +133,125 @@ module Linux
RTM_DELMDB = 85 RTM_DELMDB = 85
RTM_GETMDB = 86 RTM_GETMDB = 86
RTM_NEWNSID = 88
RTM_DELNSID = 89
RTM_GETNSID = 90
RTM_NEWSTATS = 92
RTM_GETSTATS = 94
# RT#type # RT#type
RTN_UNSPEC = 0 RTN_UNSPEC = 0
RTN_UNICAST = 1 RTN_UNICAST = 1
RTN_LOCAL = 2 RTN_LOCAL = 2
RTN_BROADCAST = 3 RTN_BROADCAST = 3
RTN_ANYCAST = 4 RTN_ANYCAST = 4
RTN_MULTICAST = 5 RTN_MULTICAST = 5
RTN_BLACKHOLE = 6 RTN_BLACKHOLE = 6
RTN_UNREACHABLE = 7 RTN_UNREACHABLE = 7
RTN_PROHIBIT = 8 RTN_PROHIBIT = 8
RTN_THROW = 9 RTN_THROW = 9
RTN_NAT = 10 RTN_NAT = 10
RTN_XRESOLVE = 11 RTN_XRESOLVE = 11
# RT#protocol # RT#protocol
RTPROT_UNSPEC = 0 RTPROT_UNSPEC = 0
RTPROT_REDIRECT = 1 RTPROT_REDIRECT = 1
RTPROT_KERNEL = 2 RTPROT_KERNEL = 2
RTPROT_BOOT = 3 RTPROT_BOOT = 3
RTPROT_STATIC = 4 RTPROT_STATIC = 4
RTPROT_GATED = 8 RTPROT_GATED = 8
RTPROT_RA = 9 RTPROT_RA = 9
RTPROT_MRT = 10 RTPROT_MRT = 10
RTPROT_ZEBRA = 11 RTPROT_ZEBRA = 11
RTPROT_BIRD = 12 RTPROT_BIRD = 12
RTPROT_DNROUTED = 13 RTPROT_DNROUTED = 13
RTPROT_XORP = 14 RTPROT_XORP = 14
RTPROT_NTK = 15 RTPROT_NTK = 15
RTPROT_DHCP = 16 RTPROT_DHCP = 16
RTPROT_MROUTED = 17 RTPROT_MROUTED = 17
RTPROT_BABEL = 42
# RT#scope, IFAddr#scope # RT#scope, IFAddr#scope
RT_SCOPE_UNIVERSE = 0 RT_SCOPE_UNIVERSE = 0
RT_SCOPE_SITE = 200 RT_SCOPE_SITE = 200
RT_SCOPE_LINK = 253 RT_SCOPE_LINK = 253
RT_SCOPE_HOST = 254 RT_SCOPE_HOST = 254
RT_SCOPE_NOWHERE = 255 RT_SCOPE_NOWHERE = 255
# RT#flags # RT#flags
RTM_F_NOTIFY = 0x100 RTM_F_NOTIFY = 0x100
RTM_F_CLONED = 0x200 RTM_F_CLONED = 0x200
RTM_F_EQUALIZE = 0x400 RTM_F_EQUALIZE = 0x400
RTM_F_PREFIX = 0x800 RTM_F_PREFIX = 0x800
RTM_F_LOOKUP_TABLE = 0x1000
# RT#table (reserved values) # RT#table (reserved values)
RT_TABLE_UNSPEC = 0 RT_TABLE_UNSPEC = 0
RT_TABLE_COMPAT = 252 RT_TABLE_COMPAT = 252
RT_TABLE_DEFAULT = 253 RT_TABLE_DEFAULT = 253
RT_TABLE_MAIN = 254 RT_TABLE_MAIN = 254
RT_TABLE_LOCAL = 255 RT_TABLE_LOCAL = 255
# routing message attributes # routing message attributes
RTA_UNSPEC = 0 RTA_UNSPEC = 0
RTA_DST = 1 RTA_DST = 1
RTA_SRC = 2 RTA_SRC = 2
RTA_IIF = 3 RTA_IIF = 3
RTA_OIF = 4 RTA_OIF = 4
RTA_GATEWAY = 5 RTA_GATEWAY = 5
RTA_PRIORITY = 6 RTA_PRIORITY = 6
RTA_PREFSRC = 7 RTA_PREFSRC = 7
RTA_METRICS = 8 RTA_METRICS = 8
RTA_MULTIPATH = 9 RTA_MULTIPATH = 9
RTA_FLOW = 11 RTA_FLOW = 11
RTA_CACHEINFO = 12 RTA_CACHEINFO = 12
RTA_TABLE = 15 RTA_TABLE = 15
RTA_MARK = 16 RTA_MARK = 16
RTA_MFC_STATS = 17 RTA_MFC_STATS = 17
RTA_VIA = 18
RTA_NEWDST = 19
RTA_PREF = 20
RTA_ENCAP_TYPE = 21
RTA_ENCAP = 22
RTA_EXPIRES = 23
RTA_PAD = 24
# Keys for RT#nh_flags # Keys for RT#nh_flags
RTNH_F_DEAD = 1 # Nexthop is dead (used by multipath) RTNH_F_DEAD = 1 # Nexthop is dead (used by multipath)
RTNH_F_PERVASIVE = 2 # Do recursive gateway lookup RTNH_F_PERVASIVE = 2 # Do recursive gateway lookup
RTNH_F_ONLINK = 4 # Gateway is forced on link RTNH_F_ONLINK = 4 # Gateway is forced on link
RTNH_F_OFFLOAD = 8 # offloaded route
RTNH_F_LINKDOWN = 16 # carrier-down on nexthop
# Keys for RT#metrics # Keys for RT#metrics
RTAX_UNSPEC = 0 RTAX_UNSPEC = 0
RTAX_LOCK = 1 RTAX_LOCK = 1
RTAX_MTU = 2 RTAX_MTU = 2
RTAX_WINDOW = 3 RTAX_WINDOW = 3
RTAX_RTT = 4 RTAX_RTT = 4
RTAX_RTTVAR = 5 RTAX_RTTVAR = 5
RTAX_SSTHRESH = 6 RTAX_SSTHRESH = 6
RTAX_CWND = 7 RTAX_CWND = 7
RTAX_ADVMSS = 8 RTAX_ADVMSS = 8
RTAX_REORDERING = 9 RTAX_REORDERING = 9
RTAX_HOPLIMIT = 10 RTAX_HOPLIMIT = 10
RTAX_INITCWND = 11 RTAX_INITCWND = 11
RTAX_FEATURES = 12 RTAX_FEATURES = 12
RTAX_RTO_MIN = 13 RTAX_RTO_MIN = 13
RTAX_INITRWND = 14 RTAX_INITRWND = 14
RTAX_QUICKACK = 15 RTAX_QUICKACK = 15
RTAX_CC_ALGO = 16
# from linux/if_link.h # from linux/if_link.h
IFLA_UNSPEC = 0 IFLA_UNSPEC = 0
IFLA_ADDRESS = 1 IFLA_ADDRESS = 1
IFLA_BROADCAST = 2 IFLA_BROADCAST = 2
IFLA_IFNAME = 3 IFLA_IFNAME = 3
IFLA_MTU = 4 IFLA_MTU = 4
IFLA_LINK = 5 IFLA_LINK = 5
IFLA_QDISC = 6 IFLA_QDISC = 6
IFLA_STATS = 7 IFLA_STATS = 7
IFLA_COST = 8 IFLA_COST = 8
IFLA_PRIORITY = 9 IFLA_PRIORITY = 9
IFLA_MASTER = 10 IFLA_MASTER = 10
IFLA_WIRELESS = 11 IFLA_WIRELESS = 11
IFLA_PROTINFO = 12 IFLA_PROTINFO = 12
IFLA_TXQLEN = 13 IFLA_TXQLEN = 13
IFLA_MAP = 14 IFLA_MAP = 14
IFLA_WEIGHT = 15 IFLA_WEIGHT = 15
IFLA_OPERSTATE = 16 IFLA_OPERSTATE = 16
IFLA_LINKMODE = 17 IFLA_LINKMODE = 17
IFLA_LINKINFO = 18 # Nested IFLA_INFO_* IFLA_LINKINFO = 18 # Nested IFLA_INFO_*
IFLA_NET_NS_PID = 19 IFLA_NET_NS_PID = 19
IFLA_IFALIAS = 20 IFLA_IFALIAS = 20
IFLA_NUM_VF = 21 IFLA_NUM_VF = 21
IFLA_VFINFO_LIST = 22 IFLA_VFINFO_LIST = 22
IFLA_STATS64 = 23 IFLA_STATS64 = 23
IFLA_VF_PORTS = 24 IFLA_VF_PORTS = 24
IFLA_PORT_SELF = 25 IFLA_PORT_SELF = 25
IFLA_AF_SPEC = 26 IFLA_AF_SPEC = 26
IFLA_GROUP = 27 IFLA_GROUP = 27
IFLA_NET_NS_FD = 28 IFLA_NET_NS_FD = 28
@@ -287,14 +261,6 @@ module Linux
IFLA_NUM_RX_QUEUES = 32 IFLA_NUM_RX_QUEUES = 32
IFLA_CARRIER = 33 IFLA_CARRIER = 33
IFLA_PHYS_PORT_ID = 34 IFLA_PHYS_PORT_ID = 34
IFLA_CARRIER_CHANGES = 35
IFLA_PHYS_SWITCH_ID = 36
IFLA_LINK_NETNSID = 37
IFLA_PHYS_PORT_NAME = 38
IFLA_PROTO_DOWN = 39
IFLA_GSO_MAX_SEGS = 40
IFLA_GSO_MAX_SIZE = 41
IFLA_PAD = 42
BRIDGE_MODE_UNSPEC = 0 BRIDGE_MODE_UNSPEC = 0
BRIDGE_MODE_HAIRPIN = 1 BRIDGE_MODE_HAIRPIN = 1
@@ -309,204 +275,174 @@ module Linux
IFLA_BRPORT_FAST_LEAVE = 7 # multicast fast leave IFLA_BRPORT_FAST_LEAVE = 7 # multicast fast leave
IFLA_BRPORT_LEARNING = 8 # mac learning IFLA_BRPORT_LEARNING = 8 # mac learning
IFLA_BRPORT_UNICAST_FLOOD = 9 # flood unicast traffic IFLA_BRPORT_UNICAST_FLOOD = 9 # flood unicast traffic
IFLA_BRPORT_PROXYARP = 10 # proxy ARP
IFLA_BRPORT_LEARNING_SYNC = 11 # mac learning sync from device
IFLA_BRPORT_PROXYARP_WIFI = 12 # proxy ARP for Wi-Fi
IFLA_BRPORT_ROOT_ID = 13 # designated root
IFLA_BRPORT_BRIDGE_ID = 14 # designated bridge
IFLA_BRPORT_DESIGNATED_PORT = 15
IFLA_BRPORT_DESIGNATED_COST = 16
IFLA_BRPORT_ID = 17
IFLA_BRPORT_NO = 18
IFLA_BRPORT_TOPOLOGY_CHANGE_ACK = 19
IFLA_BRPORT_CONFIG_PENDING = 20
IFLA_BRPORT_MESSAGE_AGE_TIMER = 21
IFLA_BRPORT_FORWARD_DELAY_TIMER = 22
IFLA_BRPORT_HOLD_TIMER = 23
IFLA_BRPORT_FLUSH = 24
IFLA_BRPORT_MULTICAST_ROUTER = 25
IFLA_BRPORT_PAD = 26
IFLA_INFO_UNSPEC = 0
IFLA_INFO_KIND = 1 # "vlan", "gre" etc
IFLA_INFO_DATA = 2 # packed rtattrs specific to type, e.g. vlan
IFLA_INFO_XSTATS = 3
IFLA_INFO_UNSPEC = 0
IFLA_INFO_KIND = 1 # "vlan", "gre" etc
IFLA_INFO_DATA = 2 # packed rtattrs specific to type, e.g. vlan
IFLA_INFO_XSTATS = 3
# INFO_DATA for INFO_KIND == "vlan" # INFO_DATA for INFO_KIND == "vlan"
IFLA_VLAN_UNSPEC = 0 IFLA_VLAN_UNSPEC = 0
IFLA_VLAN_ID = 1 # ushort IFLA_VLAN_ID = 1 # ushort
IFLA_VLAN_FLAGS = 2 # struct ifla_vlan_flags IFLA_VLAN_FLAGS = 2 # struct ifla_vlan_flags
IFLA_VLAN_EGRESS_QOS = 3 # followed by instance of IFLA_VLAN_QOS_* IFLA_VLAN_EGRESS_QOS = 3 # followed by instance of IFLA_VLAN_QOS_*
IFLA_VLAN_INGRESS_QOS = 4 # followed by instance of IFLA_VLAN_QOS_* IFLA_VLAN_INGRESS_QOS = 4 # followed by instance of IFLA_VLAN_QOS_*
IFLA_VLAN_PROTOCOL = 5 IFLA_VLAN_PROTOCOL = 5
IFLA_VLAN_QOS_UNSPEC = 0 IFLA_VLAN_QOS_UNSPEC = 0
IFLA_VLAN_QOS_MAPPING = 1 IFLA_VLAN_QOS_MAPPING = 1
IFLA_MACVLAN_UNSPEC = 0 IFLA_MACVLAN_UNSPEC = 0
IFLA_MACVLAN_MODE = 1 IFLA_MACVLAN_MODE = 1
IFLA_MACVLAN_FLAGS = 2 IFLA_MACVLAN_FLAGS = 2
IFLA_MACVLAN_MACADDR_MODE = 3
IFLA_MACVLAN_MACADDR = 4
IFLA_MACVLAN_MACADDR_DATA = 5
IFLA_MACVLAN_MACADDR_COUNT = 6
MACVLAN_MODE_PRIVATE = 1 # don't talk to other macvlans MACVLAN_MODE_PRIVATE = 1
MACVLAN_MODE_VEPA = 2 # talk to other ports through ext bridge MACVLAN_MODE_VEPA = 2
MACVLAN_MODE_BRIDGE = 4 # talk to bridge ports directly MACVLAN_MODE_BRIDGE = 4
MACVLAN_MODE_PASSTHRU = 8 # take over the underlying device MACVLAN_MODE_PASSTHRU = 8
MACVLAN_MODE_SOURCE = 16 # use source MAC address list to assign
# TODO: VXLAN and VF stuff is missing here # TODO: VXLAN and VF stuff is missing here
# linux/if_vlan.h # linux/if_vlan.h
VLAN_FLAG_REORDER_HDR = 0x1 VLAN_FLAG_REORDER_HDR = 0x1
VLAN_FLAG_GVRP = 0x2 VLAN_FLAG_GVRP = 0x2
VLAN_FLAG_LOOSE_BINDING = 0x4 VLAN_FLAG_LOOSE_BINDING = 0x4
VLAN_FLAG_MVRP = 0x8 VLAN_FLAG_MVRP = 0x8
# from linux/if_addr.h # from linux/if_addr.h
IFA_UNSPEC = 0 IFA_UNSPEC = 0
IFA_ADDRESS = 1 IFA_ADDRESS = 1
IFA_LOCAL = 2 IFA_LOCAL = 2
IFA_LABEL = 3 IFA_LABEL = 3
IFA_BROADCAST = 4 IFA_BROADCAST = 4
IFA_ANYCAST = 5 IFA_ANYCAST = 5
IFA_CACHEINFO = 6 IFA_CACHEINFO = 6
IFA_MULTICAST = 7 IFA_MULTICAST = 7
IFA_FLAGS = 8
IFA_F_SECONDARY = 0x01 IFA_F_SECONDARY = 0x01
IFA_F_TEMPORARY = IFA_F_SECONDARY IFA_F_TEMPORARY = IFA_F_SECONDARY
IFA_F_NODAD = 0x02 IFA_F_NODAD = 0x02
IFA_F_OPTIMISTIC = 0x04 IFA_F_OPTIMISTIC = 0x04
IFA_F_DADFAILED = 0x08 IFA_F_DADFAILED = 0x08
IFA_F_HOMEADDRESS = 0x10 IFA_F_HOMEADDRESS = 0x10
IFA_F_DEPRECATED = 0x20 IFA_F_DEPRECATED = 0x20
IFA_F_TENTATIVE = 0x40 IFA_F_TENTATIVE = 0x40
IFA_F_PERMANENT = 0x80 IFA_F_PERMANENT = 0x80
IFA_F_MANAGETEMPADDR = 0x100
IFA_F_NOPREFIXROUTE = 0x200
IFA_F_MCAUTOJOIN = 0x400
IFA_F_STABLE_PRIVACY = 0x800
# from linux/if_arp.h - selected subset # from linux/if_arp.h - selected subset
ARPHRD_NETROM = 0 ARPHRD_NETROM = 0
ARPHRD_ETHER = 1 ARPHRD_ETHER = 1
ARPHRD_EETHER = 2 ARPHRD_EETHER = 2
ARPHRD_AX25 = 3 ARPHRD_AX25 = 3
ARPHRD_PRONET = 4 ARPHRD_PRONET = 4
ARPHRD_CHAOS = 5 ARPHRD_CHAOS = 5
ARPHRD_IEEE802 = 6 ARPHRD_IEEE802 = 6
ARPHRD_ARCNET = 7 ARPHRD_ARCNET = 7
ARPHRD_APPLETLK = 8 ARPHRD_APPLETLK = 8
ARPHRD_DLCI = 15 ARPHRD_DLCI = 15
ARPHRD_ATM = 19 ARPHRD_ATM = 19
ARPHRD_METRICOM = 23 ARPHRD_METRICOM = 23
ARPHRD_IEEE1394 = 24 ARPHRD_IEEE1394 = 24
ARPHRD_EUI64 = 27 ARPHRD_EUI64 = 27
ARPHRD_INFINIBAND = 32 ARPHRD_INFINIBAND = 32
ARPHRD_LOOPBACK = 772 ARPHRD_LOOPBACK = 772
# ... others to be added as required # ... others to be added as required
# linux/if.h # linux/if.h
IFNAMSIZ = 16 IFNAMSIZ = 16
IFALIASZ = 256 IFALIASZ = 256
IFF_UP = 0x1 IFF_UP = 0x1
IFF_BROADCAST = 0x2 IFF_BROADCAST = 0x2
IFF_DEBUG = 0x4 IFF_DEBUG = 0x4
IFF_LOOPBACK = 0x8 IFF_LOOPBACK = 0x8
IFF_POINTOPOINT = 0x10 IFF_POINTOPOINT = 0x10
IFF_NOTRAILERS = 0x20 IFF_NOTRAILERS = 0x20
IFF_RUNNING = 0x40 IFF_RUNNING = 0x40
IFF_NOARP = 0x80 IFF_NOARP = 0x80
IFF_PROMISC = 0x100 IFF_PROMISC = 0x100
IFF_ALLMULTI = 0x200 IFF_ALLMULTI = 0x200
IFF_MASTER = 0x400 IFF_MASTER = 0x400
IFF_SLAVE = 0x800 IFF_SLAVE = 0x800
IFF_MULTICAST = 0x1000 IFF_MULTICAST = 0x1000
IFF_PORTSEL = 0x2000 IFF_PORTSEL = 0x2000
IFF_AUTOMEDIA = 0x4000 IFF_AUTOMEDIA = 0x4000
IFF_DYNAMIC = 0x8000 IFF_DYNAMIC = 0x8000
IFF_LOWER_UP = 0x10000 IFF_LOWER_UP = 0x10000
IFF_DORMANT = 0x20000 IFF_DORMANT = 0x20000
IFF_ECHO = 0x40000 IFF_ECHO = 0x40000
IFF_VOLATILE = (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\ IFF_VOLATILE = (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\
IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT) IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT)
# linux/netfilter.h # linux/netfilter.h
NF_DROP = 0 NF_DROP = 0
NF_ACCEPT = 1 NF_ACCEPT = 1
NF_STOLEN = 2 NF_STOLEN = 2
NF_QUEUE = 3 NF_QUEUE = 3
NF_REPEAT = 4 NF_REPEAT = 4
NF_STOP = 5 NF_STOP = 5
NF_INET_PRE_ROUTING = 0 NF_INET_PRE_ROUTING = 0
NF_INET_LOCAL_IN = 1 NF_INET_LOCAL_IN = 1
NF_INET_FORWARD = 2 NF_INET_FORWARD = 2
NF_INET_LOCAL_OUT = 3 NF_INET_LOCAL_OUT = 3
NF_INET_POST_ROUTING = 4 NF_INET_POST_ROUTING = 4
NF_INET_NUMHOOKS = 5 NF_INET_NUMHOOKS = 5
NFPROTO_UNSPEC = 0 NFPROTO_UNSPEC = 0
NFPROTO_INET = 1 NFPROTO_IPV4 = 2
NFPROTO_IPV4 = 2 NFPROTO_ARP = 3
NFPROTO_ARP = 3 NFPROTO_BRIDGE = 7
NFPROTO_NETDEV = 5 NFPROTO_IPV6 = 10
NFPROTO_BRIDGE = 7 NFPROTO_DECNET = 12
NFPROTO_IPV6 = 10
NFPROTO_DECNET = 12
# linux/netfilter_ipv4/ip_queue.h # linux/netfilter_ipv4/ip_queue.h
IPQ_COPY_NONE = 0 IPQ_COPY_NONE = 0
IPQ_COPY_META = 1 IPQ_COPY_META = 1
IPQ_COPY_PACKET = 2 IPQ_COPY_PACKET = 2
IPQM_MODE = 17 IPQM_MODE = 17
IPQM_VERDICT = 18 IPQM_VERDICT = 18
IPQM_PACKET = 19 IPQM_PACKET = 19
IPQM_MAX = 20 IPQM_MAX = 20
# linux/netfilter_ipv4/ipt_ULOG.h # linux/netfilter_ipv4/ipt_ULOG.h
ULOG_MAC_LEN = 80 ULOG_MAC_LEN = 80
ULOG_PREFIX_LEN = 32 ULOG_PREFIX_LEN = 32
# linux/netfilter/x_tables.h # linux/netfilter/x_tables.h
XT_TABLE_MAXNAMELEN = 32 XT_TABLE_MAXNAMELEN = 32
XT_CONTINUE = 0xffffffff XT_CONTINUE = 0xffffffff
XT_RETURN = (-NF_REPEAT - 1) XT_RETURN = (-NF_REPEAT - 1)
XT_INV_PROTO = 0x40 XT_INV_PROTO = 0x40
# linux/netfilter_ipv4/ip_tables.h # linux/netfilter_ipv4/ip_tables.h
IPT_TABLE_MAXNAMELEN = XT_TABLE_MAXNAMELEN IPT_TABLE_MAXNAMELEN = XT_TABLE_MAXNAMELEN
IPT_F_FRAG = 0x01 IPT_F_FRAG = 0x01
IPT_F_GOTO = 0x02 IPT_F_GOTO = 0x02
IPT_F_MASK = 0x03 IPT_F_MASK = 0x03
IPT_INV_VIA_IN = 0x01 IPT_INV_VIA_IN = 0x01
IPT_INV_VIA_OUT = 0x02 IPT_INV_VIA_OUT = 0x02
IPT_INV_TOS = 0x04 IPT_INV_TOS = 0x04
IPT_INV_SRCIP = 0x08 IPT_INV_SRCIP = 0x08
IPT_INV_DSTIP = 0x10 IPT_INV_DSTIP = 0x10
IPT_INV_FRAG = 0x20 IPT_INV_FRAG = 0x20
IPT_INV_PROTO = XT_INV_PROTO IPT_INV_PROTO = XT_INV_PROTO
IPT_INV_MASK = 0x7f IPT_INV_MASK = 0x7f
IPT_BASE_CTL = 64 IPT_BASE_CTL = 64
IPT_SO_SET_REPLACE = IPT_BASE_CTL IPT_SO_SET_REPLACE = IPT_BASE_CTL
IPT_SO_SET_ADD_COUNTERS = IPT_BASE_CTL + 1 IPT_SO_SET_ADD_COUNTERS = IPT_BASE_CTL + 1
IPT_SO_GET_INFO = IPT_BASE_CTL IPT_SO_GET_INFO = IPT_BASE_CTL
IPT_SO_GET_ENTRIES = IPT_BASE_CTL + 1 IPT_SO_GET_ENTRIES = IPT_BASE_CTL + 1
IPT_SO_GET_REVISION_MATCH = IPT_BASE_CTL + 2 IPT_SO_GET_REVISION_MATCH = IPT_BASE_CTL + 2
IPT_SO_GET_REVISION_TARGET = IPT_BASE_CTL + 3 IPT_SO_GET_REVISION_TARGET = IPT_BASE_CTL + 3
IPT_CONTINUE = XT_CONTINUE IPT_CONTINUE = XT_CONTINUE
IPT_RETURN = XT_RETURN IPT_RETURN = XT_RETURN
end end

View File

@@ -187,7 +187,7 @@ module Netlink
warn "Duplicate attribute #{name} (#{code}): #{attrs[name].inspect} -> #{val.inspect}" if attrs[name] warn "Duplicate attribute #{name} (#{code}): #{attrs[name].inspect} -> #{val.inspect}" if attrs[name]
attrs[name] = val attrs[name] = val
else else
warn "Unknown attribute #{code}, in class #{self}, value #{val.inspect}" if $DEBUG warn "Unknown attribute #{code}, in class #{self}, value #{val.inspect}"
attrs[code] = val attrs[code] = val
end end
end end

View File

@@ -25,7 +25,7 @@ module Netlink
# Check the sockaddr on a received message. Raises an error if the AF # Check the sockaddr on a received message. Raises an error if the AF
# is not AF_NETLINK or the PID is not 0 (this is important for security) # is not AF_NETLINK or the PID is not 0 (this is important for security)
def self.check_sockaddr(str) def self.check_sockaddr(str)
af, _, pid, _ = str.unpack(SOCKADDR_PACK) af, pad, pid, groups = str.unpack(SOCKADDR_PACK)
raise "Bad AF #{af}!" if af != Socket::AF_NETLINK raise "Bad AF #{af}!" if af != Socket::AF_NETLINK
raise "Bad PID #{pid}!" if pid != 0 raise "Bad PID #{pid}!" if pid != 0
end end
@@ -58,16 +58,14 @@ module Netlink
# :timeout => N (seconds, default to DEFAULT_TIMEOUT. Pass nil for no timeout) # :timeout => N (seconds, default to DEFAULT_TIMEOUT. Pass nil for no timeout)
# :junk_handler => lambda { ... } for unexpected packets # :junk_handler => lambda { ... } for unexpected packets
def initialize(opt) def initialize(opt)
@socket = opt[:socket] || ::Socket.new( @socket ||= opt[:socket] || ::Socket.new(
Socket::AF_NETLINK, Socket::AF_NETLINK,
Socket::SOCK_DGRAM, Socket::SOCK_DGRAM,
opt[:protocol] || (raise "Missing :protocol") opt[:protocol] || (raise "Missing :protocol")
) )
@socket.bind(NLSocket.sockaddr(opt)) unless opt[:socket] @socket.bind(NLSocket.sockaddr(opt)) unless opt[:socket]
@seq = opt[:seq] || Time.now.to_i @seq = opt[:seq] || Time.now.to_i
@pid = opt[:pid] || $$
@pid = @socket.getsockname.unpack(SOCKADDR_PACK)[2]
@timeout = opt.has_key?(:timeout) ? opt[:timeout] : DEFAULT_TIMEOUT @timeout = opt.has_key?(:timeout) ? opt[:timeout] : DEFAULT_TIMEOUT
if opt.has_key?(:junk_handler) if opt.has_key?(:junk_handler)
@junk_handler = opt[:junk_handler] @junk_handler = opt[:junk_handler]
@@ -77,7 +75,7 @@ module Netlink
} }
end end
end end
# Close the Netlink socket # Close the Netlink socket
def close def close
@socket.close @socket.close
@@ -87,7 +85,7 @@ module Netlink
def next_seq def next_seq
@seq = (@seq + 1) & 0xffffffff @seq = (@seq + 1) & 0xffffffff
end end
# Add a header and send a single message over the socket. # Add a header and send a single message over the socket.
# type:: the message type code # type:: the message type code
# msg:: the message to send (without header) # msg:: the message to send (without header)
@@ -137,8 +135,8 @@ module Netlink
# (Compare: rtnl_talk in lib/libnetlink.c, with answer=NULL) # (Compare: rtnl_talk in lib/libnetlink.c, with answer=NULL)
def cmd(type, msg, flags=NLM_F_REQUEST, resp_type=NLMSG_ERROR, timeout=@timeout, sockaddr=SOCKADDR_DEFAULT) def cmd(type, msg, flags=NLM_F_REQUEST, resp_type=NLMSG_ERROR, timeout=@timeout, sockaddr=SOCKADDR_DEFAULT)
send_request(type, msg, flags|NLM_F_ACK, sockaddr) send_request(type, msg, flags|NLM_F_ACK, sockaddr)
receive_responses(true, timeout) do |rtype,rmsg| receive_responses(true, timeout) do |type,msg|
return rmsg if rtype == resp_type return msg if type == resp_type
false false
end end
end end
@@ -146,7 +144,7 @@ module Netlink
# Discard all waiting messages # Discard all waiting messages
def drain def drain
while select([@socket], nil, nil, 0) while select([@socket], nil, nil, 0)
mesg, _, _, _ = @socket.recvmsg mesg, sender, rflags, controls = @socket.recvmsg
raise EOFError unless mesg raise EOFError unless mesg
end end
end end
@@ -205,13 +203,13 @@ module Netlink
end end
end end
end end
# Receive one datagram from kernel. Validates the sender, and returns # Receive one datagram from kernel. Validates the sender, and returns
# the raw binary message. Raises an exception on timeout or if the # the raw binary message. Raises an exception on timeout or if the
# kernel closes the socket. # kernel closes the socket.
def recvmsg(timeout=@timeout) def recvmsg(timeout=@timeout)
if select([@socket], nil, nil, timeout) if select([@socket], nil, nil, timeout)
mesg, sender, _, _ = @socket.recvmsg mesg, sender, rflags, controls = @socket.recvmsg
raise EOFError unless mesg raise EOFError unless mesg
sender = sender.to_sockaddr if sender.respond_to? :to_sockaddr sender = sender.to_sockaddr if sender.respond_to? :to_sockaddr
NLSocket.check_sockaddr(sender) NLSocket.check_sockaddr(sender)

View File

@@ -24,10 +24,6 @@ module Netlink
:pack => lambda { |val,obj| val.to_a.pack("L*") }, :pack => lambda { |val,obj| val.to_a.pack("L*") },
:unpack => lambda { |str,obj| IFACacheInfo.new(*(str.unpack("L*"))) } :unpack => lambda { |str,obj| IFACacheInfo.new(*(str.unpack("L*"))) }
rtattr :multicast, IFA_MULTICAST, :l3addr rtattr :multicast, IFA_MULTICAST, :l3addr
# TODO: is there any difference between flags and ifa_flags? The latter only
# shows up on newer kernels
rtattr :ifa_flags, IFA_FLAGS, :uint
end end
module Route module Route

View File

@@ -122,7 +122,6 @@ module Netlink
:unpack => lambda { |str,obj| VlanFlags.parse(str) } :unpack => lambda { |str,obj| VlanFlags.parse(str) }
rtattr :egress_qos, IFLA_VLAN_EGRESS_QOS rtattr :egress_qos, IFLA_VLAN_EGRESS_QOS
rtattr :ingress_qos, IFLA_VLAN_INGRESS_QOS rtattr :ingress_qos, IFLA_VLAN_INGRESS_QOS
rtattr :protocol, IFLA_VLAN_PROTOCOL, :ushort
end end
module Route module Route

View File

@@ -8,12 +8,12 @@ module Netlink
def clear_cache def clear_cache
# No cache # No cache
end end
def list(filter={}, &blk) def list(filter={}, &blk)
@rtsocket.link.list(filter.merge(:kind=>"vlan")) @rtsocket.link.list(filter.merge(:kind=>"vlan"))
end end
alias :each :list alias :each :list
# Higher-level API to manipulate VLAN interface. # Higher-level API to manipulate VLAN interface.
# nl.vlans.add( # nl.vlans.add(
# :link=>"lo", # :link=>"lo",
@@ -24,15 +24,15 @@ module Netlink
def add(opt) def add(opt)
@rtsocket.link.add(vlan_options(opt)) @rtsocket.link.add(vlan_options(opt))
end end
def change(opt) def change(opt)
@rtsocket.link.change(vlan_options(opt)) @rtsocket.link.change(vlan_options(opt))
end end
def replace(opt) def replace(opt)
@rtsocket.link.replace(vlan_options(opt)) @rtsocket.link.replace(vlan_options(opt))
end end
# Delete vlan given :link and :vlan_id. If you want to delete # Delete vlan given :link and :vlan_id. If you want to delete
# by :index then call link.delete instead. # by :index then call link.delete instead.
def delete(opt) def delete(opt)
@@ -59,7 +59,6 @@ module Netlink
end end
li.data.egress_qos = opt.delete(:egress_qos) if opt.has_key?(:egress_qos) li.data.egress_qos = opt.delete(:egress_qos) if opt.has_key?(:egress_qos)
li.data.ingress_qos = opt.delete(:ingress_qos) if opt.has_key?(:ingress_qos) li.data.ingress_qos = opt.delete(:ingress_qos) if opt.has_key?(:ingress_qos)
li.data.protocol = opt.delete(:protocol) if opt.has_key?(:protocol)
opt opt
end end
end end

View File

@@ -5,9 +5,9 @@ $:.unshift lib unless $:.include? lib
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.name = "netlinkrb" s.name = "netlinkrb"
s.version = "0.18" s.version = "0.12"
s.platform = Gem::Platform::RUBY s.platform = Gem::Platform::RUBY
s.authors = ["Brian Candler", "Matthew Bloch", "Patrick Cherry", "Alex Young", "Nicholas Thomas"] s.authors = ["Brian Candler", "Matthew Bloch", "Patrick Cherry", "Alex Young"]
s.email = ["matthew@bytemark.co.uk"] s.email = ["matthew@bytemark.co.uk"]
s.summary = "Interface to Linux' Netlink API" s.summary = "Interface to Linux' Netlink API"
s.description = "Ruby native interface to the Netlink API which avoids shelling out to command-line tools as much as possible." s.description = "Ruby native interface to the Netlink API which avoids shelling out to command-line tools as much as possible."

View File

@@ -1,6 +1,10 @@
require File.expand_path( File.join(File.dirname(__FILE__), 'test_helper') ) require File.join(File.dirname(__FILE__), 'test_helper')
require 'linux/netlink/route' require 'linux/netlink/route'
# Note: multiple sockets bound to the same PID seem to cause timeout problems.
# (Should we use different algorithm for generating the PID? PID + seq?)
$ip ||= Linux::Netlink::Route::Socket.new
# #
# Ruby 1.8.7 appears to lack the KeyError constant. # Ruby 1.8.7 appears to lack the KeyError constant.
# #
@@ -11,7 +15,7 @@ end
class TestAddr < Test::Unit::TestCase class TestAddr < Test::Unit::TestCase
context "With netlink route socket" do context "With netlink route socket" do
setup do setup do
@ip = Linux::Netlink::Route::Socket.new @ip = $ip
@ifname = nil @ifname = nil
end end
@@ -21,52 +25,12 @@ class TestAddr < Test::Unit::TestCase
rescue KeyError, IndexError rescue KeyError, IndexError
# Do nothing # Do nothing
end end
@ip.close
end end
test "Read link type" do test "Read link type" do
assert_equal Linux::ARPHRD_LOOPBACK, @ip.link["lo"].type assert_equal Linux::ARPHRD_LOOPBACK, @ip.link["lo"].type
end end
test "Both sockets work if two are open at the same time" do
begin
@ip2 = Linux::Netlink::Route::Socket.new
assert_kind_of Enumerable, @ip.route.list
assert_kind_of Enumerable, @ip2.route.list
ensure
@ip2.close
end
end
test "massively parallel IP address addition" do
@ifname = create_test_interface
return if @ifname.nil?
link = @ip.link.list.find{|x| x.ifname == @ifname}
return if link.nil?
ips = (10..13).map {|y| (1..254).map {|z| "10.100.#{y}.#{z}" } }.flatten.compact
threads = ips.map {|ip|
Thread.new {
Linux::Netlink::Route::Socket.new.addr.add(
:index => @ifname,
:local => ip,
:prefixlen => 8
)
}
}
threads.map{|t| t.join }
created = @ip.addr.list(:index => @ifname, :family => Socket::AF_INET).
map {|ifaddr| ifaddr.address.to_s }
ips.each {|ip| assert created.include?( ip ), "#{ip} was not created" }
end
def create_test_interface(ifname = "test_#{$$}") def create_test_interface(ifname = "test_#{$$}")
begin begin
@ip.link.add( @ip.link.add(