Compare commits

...

60 Commits

Author SHA1 Message Date
Patrick J Cherry
7fa4149ade New stretch release 2015-11-10 13:40:10 +00:00
Patrick J Cherry
9e6ce9d913 Merged in another test fix 2015-04-02 11:53:48 +01:00
Patrick J Cherry
06d78d4168 Scaled back the massive allocation of IPs from 11 /24s to 4.
Otherwise I get

Error: test_massively_parallel_IP_address_addition(TestAddr::TestWithNetlinkRouteSocket)
  Errno::EMFILE: Too many open files - socket(2)
  lib/linux/netlink/nlsocket.rb:61:in `initialize'
  lib/linux/netlink/nlsocket.rb:61:in `new'
  lib/linux/netlink/nlsocket.rb:61:in `initialize'
  lib/linux/netlink/route.rb:21:in `initialize'
  test/t_route.rb:54:in `new'
  test/t_route.rb:54:in `block (4 levels) in <class:TestAddr>'
2015-04-02 11:52:56 +01:00
Patrick J Cherry
a97bbe0d7c Merged in new tests 2015-04-02 11:47:17 +01:00
Patrick J Cherry
2ceb0fbf6d Make sure link exists before proceeding with test 2015-04-02 11:44:40 +01:00
Patrick J Cherry
d771a2be9c New tests 2015-04-01 23:12:30 +01:00
Patrick J Cherry
51b8bbcd8a Fixed new massive IP test thing to work with ruby1.8 and also non-root users 2015-04-01 23:05:41 +01:00
Patrick J Cherry
118903d9d5 Added tag 0.17-1+jessie1 for changeset 149ff4e2efb4 2015-04-01 22:52:30 +01:00
Patrick J Cherry
0ed037fc9d New jessie release 2015-04-01 22:52:10 +01:00
Patrick J Cherry
aa45b7fa3e Added tag 0.17 for changeset ecf38b43dd66 2015-04-01 22:43:23 +01:00
Patrick J Cherry
981eb2ec29 Version bump 2015-04-01 22:43:20 +01:00
Patrick J Cherry
4b17ea4714 new branch 2015-04-01 17:40:19 +01:00
nick
6ebbdbbf87 Update gemspec 2014-08-27 10:24:13 +01:00
nick
71ac26af38 Automated merge with ssh://dev.bytemark.co.uk//repos/netlinkrb 2014-08-27 09:06:49 +01:00
nick
4afbfa91c0 tests: Add a create-many-IPs-in-parallel test, as this is a common operation 2014-08-27 09:06:44 +01:00
Patrick J Cherry
05e54f22e8 Added tag 0.16-1+wheezy1 for changeset c0eb6a0f135a 2014-08-26 16:34:27 +01:00
Patrick J Cherry
f2f99ce8e4 New upstream release. 2014-08-26 16:34:20 +01:00
Patrick J Cherry
617129b707 Don't whinge about missing attributes 2014-08-26 16:31:34 +01:00
nick
a8ad8c1e09 Fix the tests now that you can have multiple sockets open at once 2014-04-15 15:17:09 +01:00
nick
cac6e7698b Fix a multiple-sockets-in-one-process issue.
"pid" is not "process id" in netlink, but rather, "port id". If you bind to a
sockaddr == 0 then Linux automatically assigns your socket a port id - which
happens to be the same as the process ID for the first one concurrently open.

For the second and subsequent concurrently-open sockets, binding 0 (as most
users of this library will do) gets you back a random high-numbered port id.

This change preserves the existing use case (one port open in the process,
binding to 0) while fixing multiple-ports-open-in-the-same-process, socket-is-
passed-in-and-pid-is-not-specified, and specific-pid-is-requested-but-could-
not-bind-to-it.

We're probably still not thread-safe - the seq handling looks dodgy - but at
least now we can use multiple sockets in separate threads and have them all
work.

Using the same socket from multiple threads is a slightly niche use case, and
it's tempting to say "don't do this" instead...
2014-04-15 15:10:39 +01:00
nick
28cda0ee62 Add the IFA_FLAGS RTAttr and a couple of new flags 2014-04-15 14:12:06 +01:00
nick
810c743583 Make the test helper path absolute 2014-04-15 13:49:18 +01:00
Patrick J Cherry
8d47c623c4 Added tag 0.15-1+wheezy1 for changeset 73cc3d95f810 2014-01-21 10:01:59 +00:00
Patrick J Cherry
827ca74740 New upstream release 2014-01-21 10:01:42 +00:00
Patrick J Cherry
6cbda4bb58 Added tag 0.15 for changeset 3dae37c40d73 2014-01-21 09:59:32 +00:00
Patrick J Cherry
e0aae9c67c re-tidied up warnings. 2014-01-21 09:51:37 +00:00
Patrick J Cherry
e96601981b Tidied up warnings in nlsocket 2014-01-18 07:08:19 +00:00
Patrick J Cherry
75a6eaca70 Added tag 0.14-1+wheezy1 for changeset babbc25e15f5 2013-11-14 13:38:35 +00:00
Patrick J Cherry
427fa40ef4 New upstream release 2013-11-14 13:37:57 +00:00
Patrick J Cherry
8bbb45af33 Added tag 0.14 for changeset b75625aab29e 2013-11-14 11:50:06 +00:00
nick
d86d0c8408 Automated merge with ssh://dev.bytemark.co.uk/netlinkrb 2013-11-13 17:52:55 +00:00
nick
0281a5e4eb VlanInfo: Parse the new protocol attribute 2013-11-13 17:52:32 +00:00
Patrick J Cherry
84c0414550 Added tag 0.13 for changeset 2344803abef0 2013-11-13 16:19:11 +00:00
Patrick J Cherry
7ad9816fc3 Added tag 0.13-1+wheezy1 for changeset 6681f37480ff 2013-11-13 16:17:36 +00:00
Patrick J Cherry
4e4d0e02b6 New upstream release 2013-11-13 16:16:57 +00:00
nick
610a70fe12 upstream: Add constants we're interested in to Linux kernel 3.12 2013-11-13 16:11:33 +00:00
Patrick J Cherry
a4afa867a1 Added tag 0.12-1+wheezy1 for changeset 5a2086dbce00 2013-09-12 14:27:19 +01:00
Patrick J Cherry
72ce94ef59 Merge, new upstream release 2013-09-12 14:27:08 +01:00
Patrick J Cherry
2e47380c9e Added tag 0.12 for changeset f95fbb61dafc 2013-09-12 14:21:24 +01:00
Patrick J Cherry
b0f17ca852 Version bump 2013-09-12 14:21:20 +01:00
Patrick J Cherry
72c0711c98 Added new constants to IFInfo struct 2013-09-12 11:38:30 +00:00
Patrick J Cherry
0448e47a69 Added more IFLA constants 2013-09-12 11:22:59 +00:00
Patrick J Cherry
a16a66ccdd More test robustification 2013-09-11 15:44:25 +00:00
Patrick J Cherry
1772341df6 Robustification of tests. 2013-09-11 16:16:22 +01:00
Patrick J Cherry
32309e4797 Updated test to fall back to eth0 when trying to create a dummy interface 2013-09-11 14:37:40 +00:00
Patrick J Cherry
ee38239429 merge 2013-07-16 16:50:24 +01:00
Patrick J Cherry
f2657674aa updated gemspec 2013-07-16 16:49:15 +01:00
Patrick J Cherry
33fe733d3f merge 2013-07-16 16:47:11 +01:00
Patrick J Cherry
796724e012 Foo 2013-07-16 16:28:40 +01:00
Patrick J Cherry
181d3cd30a Foo 2013-07-16 16:28:40 +01:00
Patrick J Cherry
4ed52c07dd Added tag 0.11-1+wheezy2 for changeset 123ea9ee6130 2013-07-05 14:25:40 +01:00
Patrick J Cherry
ffe52106cd merged heads 2013-07-05 14:25:08 +01:00
Patrick J Cherry
10f11d9bc1 Updated package name to match ruby-packaging standards.
Added patch to remove rubygems requirements.
2013-07-05 14:23:49 +01:00
Patrick J Cherry
4cba09d819 Added patches to remove rubygems requirements. 2013-07-05 14:17:24 +01:00
Patrick J Cherry
9e1b28a8b1 Added tag 0.11-1+wheezy1 for changeset 5db0aa45b5e2 2013-07-05 13:58:14 +01:00
Patrick J Cherry
08050fbec7 Updated packaging for wheezy. 2013-07-05 13:58:07 +01:00
Patrick J Cherry
7eb0b073ec Added wheezy branch 2013-07-05 13:54:39 +01:00
Patrick J Cherry
d8a9da0521 Removed debian packaging from upstream branch 2013-07-05 13:53:59 +01:00
Patrick J Cherry
1b599fe046 Added upstream branch 2013-07-05 13:53:21 +01:00
Patrick J Cherry
ef2a7b1f56 Added squeeze branch 2013-07-05 13:53:09 +01:00
18 changed files with 372 additions and 169 deletions

View File

@@ -1,4 +1,7 @@
^debian/liblinux-netlink-ruby ^debian/ruby-linux-netlink$
~$ ~$
^.config-liblinux-netlink-ruby ^.config-liblinux-netlink-ruby
^.pc/
^debian/files$ ^debian/files$
^debian/.*\.substvars$
^debian/.*\.debhelper.log$

56
debian/changelog vendored
View File

@@ -1,8 +1,58 @@
linux-netlink-ruby (0.11-1+squeeze1) oldstable; urgency=low ruby-linux-netlink (0.17-1+stretch1) testing; urgency=medium
* New upstream version. * Repackaged for stretch.
-- Patrick J Cherry <patrick@bytemark.co.uk> Fri, 05 Jul 2013 13:52:09 +0100 -- Patrick J Cherry <patrick@bytemark.co.uk> Tue, 10 Nov 2015 13:39:37 +0000
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.
-- Patrick J Cherry <patch@dynamo> Tue, 26 Aug 2014 16:33:48 +0100
ruby-linux-netlink (0.15-1+wheezy1) stable; urgency=low
* New upstream release.
-- Patrick J Cherry <patrick@bytemark.co.uk> Tue, 21 Jan 2014 10:01:20 +0000
ruby-linux-netlink (0.14-1+wheezy1) stable; urgency=low
* New upstream release.
-- Patrick J Cherry <patrick@bytemark.co.uk> Thu, 14 Nov 2013 13:37:28 +0000
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

37
debian/control vendored
View File

@@ -1,39 +1,18 @@
Source: linux-netlink-ruby Source: ruby-linux-netlink
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), cdbs, ruby1.8, ruby1.9.1, ruby-pkg-tools, rake Build-Depends: debhelper (>= 7), gem2deb, rake, ruby-ffi
Standards-Version: 3.8.0 Standards-Version: 3.8.0
XS-Ruby-Versions: all
Package: liblinux-netlink-ruby Package: ruby-linux-netlink
Architecture: all Architecture: any
Depends: liblinux-netlink-ruby1.8 | liblinux-netlink-ruby1.9.1, ${misc:Depends} Depends: ruby | ruby-interpreter, ruby-ffi, ${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

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

View File

@@ -0,0 +1,32 @@
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

1
debian/patches/series vendored Normal file
View File

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

2
debian/ruby-test-files.yaml vendored Normal file
View File

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

20
debian/rules vendored
View File

@@ -1,11 +1,23 @@
#!/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 %:
include /usr/share/ruby-pkg-tools/1/class/ruby-setup-rb.mk dh $@ --buildsystem=ruby --with ruby
makebuilddir:: override_dh_auto_build-arch:
rake lib/linux/c_struct_sizeof_size_t.rb rake lib/linux/c_struct_sizeof_size_t.rb
clean:: override_dh_auto_clean:
rake clean rake clean

1
debian/source/format vendored Normal file
View File

@@ -0,0 +1 @@
3.0 (quilt)

View File

@@ -29,8 +29,8 @@ module Linux
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
@@ -40,72 +40,74 @@ module Linux
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
NETLINK_ADD_MEMBERSHIP = 1 NETLINK_ADD_MEMBERSHIP = 1
NETLINK_DROP_MEMBERSHIP = 2 NETLINK_DROP_MEMBERSHIP = 2
NETLINK_PKTINFO = 3 NETLINK_PKTINFO = 3
NETLINK_BROADCAST_ERROR = 4 NETLINK_BROADCAST_ERROR = 4
NETLINK_NO_ENOBUFS = 5 NETLINK_NO_ENOBUFS = 5
NETLINK_RX_RING = 6
NETLINK_TX_RING = 7
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_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
@@ -113,16 +115,25 @@ module Linux
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_GETNETCONF = 82
RTM_NEWMDB = 84
RTM_DELMDB = 85
RTM_GETMDB = 86
# RT#type # RT#type
RTN_UNSPEC = 0 RTN_UNSPEC = 0
RTN_UNICAST = 1 RTN_UNICAST = 1
@@ -136,7 +147,7 @@ module Linux
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
@@ -152,7 +163,8 @@ module Linux
RTPROT_XORP = 14 RTPROT_XORP = 14
RTPROT_NTK = 15 RTPROT_NTK = 15
RTPROT_DHCP = 16 RTPROT_DHCP = 16
RTPROT_MROUTED = 17
# RT#scope, IFAddr#scope # RT#scope, IFAddr#scope
RT_SCOPE_UNIVERSE = 0 RT_SCOPE_UNIVERSE = 0
RT_SCOPE_SITE = 200 RT_SCOPE_SITE = 200
@@ -172,7 +184,7 @@ module Linux
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
@@ -188,7 +200,13 @@ module Linux
RTA_CACHEINFO = 12 RTA_CACHEINFO = 12
RTA_TABLE = 15 RTA_TABLE = 15
RTA_MARK = 16 RTA_MARK = 16
RTA_MFC_STATS = 17
# Keys for RT#nh_flags
RTNH_F_DEAD = 1 # Nexthop is dead (used by multipath)
RTNH_F_PERVASIVE = 2 # Do recursive gateway lookup
RTNH_F_ONLINK = 4 # Gateway is forced on link
# Keys for RT#metrics # Keys for RT#metrics
RTAX_UNSPEC = 0 RTAX_UNSPEC = 0
RTAX_LOCK = 1 RTAX_LOCK = 1
@@ -205,7 +223,8 @@ module Linux
RTAX_FEATURES = 12 RTAX_FEATURES = 12
RTAX_RTO_MIN = 13 RTAX_RTO_MIN = 13
RTAX_INITRWND = 14 RTAX_INITRWND = 14
RTAX_QUICKACK = 15
# from linux/if_link.h # from linux/if_link.h
IFLA_UNSPEC = 0 IFLA_UNSPEC = 0
IFLA_ADDRESS = 1 IFLA_ADDRESS = 1
@@ -233,11 +252,29 @@ module Linux
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
IFLA_EXT_MASK = 29 IFLA_EXT_MASK = 29
IFLA_PROMISCUITY = 30 IFLA_PROMISCUITY = 30
IFLA_NUM_TX_QUEUES = 31
IFLA_NUM_RX_QUEUES = 32
IFLA_CARRIER = 33
IFLA_PHYS_PORT_ID = 34
BRIDGE_MODE_UNSPEC = 0
BRIDGE_MODE_HAIRPIN = 1
IFLA_BRPORT_UNSPEC = 0
IFLA_BRPORT_STATE = 1 # Spanning tree state
IFLA_BRPORT_PRIORITY = 2 # " priority
IFLA_BRPORT_COST = 3 # " cost
IFLA_BRPORT_MODE = 4 # mode (hairpin)
IFLA_BRPORT_GUARD = 5 # bpdu guard
IFLA_BRPORT_PROTECT = 6 # root port protection
IFLA_BRPORT_FAST_LEAVE = 7 # multicast fast leave
IFLA_BRPORT_LEARNING = 8 # mac learning
IFLA_BRPORT_UNICAST_FLOOD = 9 # flood unicast traffic
IFLA_INFO_UNSPEC = 0 IFLA_INFO_UNSPEC = 0
IFLA_INFO_KIND = 1 # "vlan", "gre" etc IFLA_INFO_KIND = 1 # "vlan", "gre" etc
@@ -250,44 +287,52 @@ module Linux
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_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
MACVLAN_MODE_PRIVATE = 1 MACVLAN_MODE_PRIVATE = 1
MACVLAN_MODE_VEPA = 2 MACVLAN_MODE_VEPA = 2
MACVLAN_MODE_BRIDGE = 4 MACVLAN_MODE_BRIDGE = 4
MACVLAN_MODE_PASSTHRU = 8 MACVLAN_MODE_PASSTHRU = 8
# 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
# 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
# from linux/if_arp.h # 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
@@ -345,7 +390,7 @@ module Linux
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_IPV4 = 2 NFPROTO_IPV4 = 2
NFPROTO_ARP = 3 NFPROTO_ARP = 3
@@ -357,7 +402,7 @@ module Linux
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
@@ -366,22 +411,22 @@ module Linux
# 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
@@ -390,17 +435,17 @@ module Linux
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}" warn "Unknown attribute #{code}, in class #{self}, value #{val.inspect}" if $DEBUG
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, pad, pid, groups = str.unpack(SOCKADDR_PACK) af, _, pid, _ = 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,14 +58,16 @@ 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]
@@ -75,7 +77,7 @@ module Netlink
} }
end end
end end
# Close the Netlink socket # Close the Netlink socket
def close def close
@socket.close @socket.close
@@ -85,7 +87,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)
@@ -135,8 +137,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 |type,msg| receive_responses(true, timeout) do |rtype,rmsg|
return msg if type == resp_type return rmsg if rtype == resp_type
false false
end end
end end
@@ -144,7 +146,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, sender, rflags, controls = @socket.recvmsg mesg, _, _, _ = @socket.recvmsg
raise EOFError unless mesg raise EOFError unless mesg
end end
end end
@@ -203,13 +205,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, rflags, controls = @socket.recvmsg mesg, sender, _, _ = @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,6 +24,10 @@ 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

@@ -65,6 +65,9 @@ module Netlink
rtattr :net_ns_fd, IFLA_NET_NS_FD rtattr :net_ns_fd, IFLA_NET_NS_FD
rtattr :ext_mask, IFLA_EXT_MASK rtattr :ext_mask, IFLA_EXT_MASK
rtattr :promiscuity, IFLA_PROMISCUITY rtattr :promiscuity, IFLA_PROMISCUITY
rtattr :num_tx_queues, IFLA_NUM_TX_QUEUES
rtattr :num_rx_queues, IFLA_NUM_RX_QUEUES
rtattr :carrier, IFLA_CARRIER
# Return the best stats available (64bit or 32bit) # Return the best stats available (64bit or 32bit)
def stats def stats
@@ -119,6 +122,7 @@ 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,6 +59,7 @@ 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.11" s.version = "0.17"
s.platform = Gem::Platform::RUBY s.platform = Gem::Platform::RUBY
s.authors = ["Brian Candler", "Patrick Cherry", "Alex Young"] s.authors = ["Brian Candler", "Matthew Bloch", "Patrick Cherry", "Alex Young", "Nicholas Thomas"]
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,10 +1,6 @@
require File.join(File.dirname(__FILE__), 'test_helper') require File.expand_path( 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.
# #
@@ -15,21 +11,62 @@ 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 = $ip @ip = Linux::Netlink::Route::Socket.new
@ifname = nil
end end
teardown do teardown do
begin begin
delete_test_interface delete_test_interface(@ifname)
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(
@@ -38,28 +75,29 @@ class TestAddr < Test::Unit::TestCase
:kind => "dummy" :kind => "dummy"
) )
) )
rescue Errno::EOPNOTSUPP
# Ugh, fall back to eth0
ifname = "eth0"
rescue Errno::EPERM => err rescue Errno::EPERM => err
if self.respond_to?(:skip) do_skip err.to_s
skip err.to_s
else
puts "Skipping #{self.method_name} -- #{err.to_s}"
return nil
end
end end
return ifname return ifname
end end
def set_interface_up(ifname) def set_interface_up(ifname)
link = @ip.link.list.find{|l| l.ifname == ifname} link = @ip.link.list.find{|l| l.ifname == ifname}
# return if link.nil?
# Bring the link up return unless link.linkinfo and "dummy" == link.linkinfo.kind
#
@ip.link.change( #
:index => link.index, # Bring the link up
:flags => link.flags | Linux::IFF_UP | Linux::IFF_RUNNING #
) @ip.link.change(
:index => link.index,
:flags => link.flags | Linux::IFF_UP | Linux::IFF_RUNNING
)
link = @ip.link.list.find{|l| l.ifname == ifname} link = @ip.link.list.find{|l| l.ifname == ifname}
@@ -71,6 +109,7 @@ class TestAddr < Test::Unit::TestCase
link = @ip.link.list.find{|l| l.ifname == ifname} link = @ip.link.list.find{|l| l.ifname == ifname}
return if link.nil? return if link.nil?
return unless link.linkinfo and "dummy" == link.linkinfo.kind
return unless link.flags == (link.flags | Linux::IFF_UP | Linux::IFF_RUNNING) return unless link.flags == (link.flags | Linux::IFF_UP | Linux::IFF_RUNNING)
# #
@@ -87,19 +126,39 @@ class TestAddr < Test::Unit::TestCase
assert_equal(0, link.flags & Linux::IFF_RUNNING, "Link still has the IFF_RUNNING flag set") assert_equal(0, link.flags & Linux::IFF_RUNNING, "Link still has the IFF_RUNNING flag set")
end end
def delete_test_interface(ifname = "test_#{$$}") def delete_test_interface(ifname)
unless @ip.link[ifname] and @ip.link[ifname].linkinfo and "dummy" == @ip.link[ifname].linkinfo.kind
return nil
end
begin begin
set_interface_down(ifname) set_interface_down(ifname)
ensure ensure
@ip.link.delete(:index => ifname) @ip.link.delete(:index => ifname)
end end
end end
test "Add and remove dummy interface" do
ifname = create_test_interface
return if ifname.nil?
delete_test_interface(ifname) def do_skip(msg)
if self.respond_to?(:skip)
skip msg
else
puts "Skipping #{self.method_name} -- #{msg}"
end
return nil
end
test "Add and remove dummy interface" do
@ifname = create_test_interface
return if @ifname.nil?
link = @ip.link.list.find{|x| x.ifname == @ifname}
return if link.nil?
unless link.linkinfo and "dummy" == link.linkinfo.kind
return do_skip("Could not create dummy interface")
end
delete_test_interface(@ifname)
end end
def addrlist(opt = {:index=>"lo"}) def addrlist(opt = {:index=>"lo"})
@@ -107,23 +166,26 @@ class TestAddr < Test::Unit::TestCase
end end
def add_and_remove_addr(testaddr, pfx) def add_and_remove_addr(testaddr, pfx)
ifname = create_test_interface @ifname = create_test_interface
return if ifname.nil? return if @ifname.nil?
addrs1 = addrlist({:index => ifname}) link = @ip.link.list.find{|x| x.ifname == @ifname}
return if link.nil?
addrs1 = addrlist({:index => @ifname})
assert !addrs1.include?(testaddr) assert !addrs1.include?(testaddr)
@ip.addr.add(:index=>ifname, :local=>testaddr, :prefixlen=>pfx) @ip.addr.add(:index=>@ifname, :local=>testaddr, :prefixlen=>pfx)
assert_raises(Errno::EEXIST) { assert_raises(Errno::EEXIST) {
@ip.addr.add(:index=>ifname, :local=>testaddr, :prefixlen=>pfx) @ip.addr.add(:index=>@ifname, :local=>testaddr, :prefixlen=>pfx)
} }
addrs2 = addrlist({:index => ifname}) addrs2 = addrlist({:index => @ifname})
assert addrs2.include?(testaddr), "#{addrs2.inspect} doesn't include #{testaddr}" assert addrs2.include?(testaddr), "#{addrs2.inspect} doesn't include #{testaddr}"
@ip.addr.delete(:index=>ifname, :local=>testaddr, :prefixlen=>pfx) @ip.addr.delete(:index=>@ifname, :local=>testaddr, :prefixlen=>pfx)
addrs3 = addrlist({:index => ifname}) addrs3 = addrlist({:index => @ifname})
assert_equal addrs1, addrs3 assert_equal addrs1, addrs3
end end
@@ -158,22 +220,24 @@ class TestAddr < Test::Unit::TestCase
end end
test "Add and remove vlan" do test "Add and remove vlan" do
ifname = create_test_interface @ifname = create_test_interface
return if ifname.nil? return if @ifname.nil?
vlans1 = vlanlist(ifname) link = @ip.link.list.find{|x| x.ifname == @ifname}
return if link.nil?
vlans1 = vlanlist(@ifname)
assert !vlans1.include?(1234) assert !vlans1.include?(1234)
@ip.vlan.add(:link=>ifname, :vlan_id=>1234) @ip.vlan.add(:link=>@ifname, :vlan_id=>1234)
vlans2 = vlanlist(ifname) vlans2 = vlanlist(@ifname)
assert vlans2.include?(1234) assert vlans2.include?(1234)
@ip.vlan.delete(:link=>ifname, :vlan_id=>1234) @ip.vlan.delete(:link=>@ifname, :vlan_id=>1234)
vlans3 = vlanlist(ifname) vlans3 = vlanlist(@ifname)
assert_equal vlans1, vlans3 assert_equal vlans1, vlans3
@ip.link.delete(:index => ifname)
end end
def routes def routes
@@ -191,13 +255,17 @@ class TestAddr < Test::Unit::TestCase
end end
def add_and_remove_route(info) def add_and_remove_route(info)
ifname = create_test_interface @ifname = create_test_interface
return if ifname.nil? return if @ifname.nil?
set_interface_up(ifname) set_interface_up(@ifname)
info[:oif] = ifname info[:oif] = @ifname
ifidx = @ip.link.list.find{|x| x.ifname == info[:oif]}.index
link = @ip.link.list.find{|x| x.ifname == info[:oif]}
return if link.nil?
ifidx = link.index
assert_equal 0, routes.select { |x| x == [info[:dst], info[:dst_len], ifidx] }.size assert_equal 0, routes.select { |x| x == [info[:dst], info[:dst_len], ifidx] }.size