Compare commits

..

27 Commits

Author SHA1 Message Date
Patrick J Cherry
f2e31b5337 New upstream release 2013-11-14 13:37:10 +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
5880ede839 Added tag 0.13-1+squeeze1 for changeset 03fdcb15a9be 2013-11-13 16:18:05 +00:00
Patrick J Cherry
ff565e1dd3 New upstream release 2013-11-13 16:16:25 +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
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
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
c0263e83d0 merge 2013-07-16 16:52:27 +01:00
Patrick J Cherry
f2657674aa updated gemspec 2013-07-16 16:49:15 +01:00
Patrick J Cherry
2251b116ce merge 2013-07-16 16:45:29 +01:00
Patrick J Cherry
796724e012 Foo 2013-07-16 16:28:40 +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
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
12 changed files with 231 additions and 126 deletions

View File

@@ -1,4 +1,4 @@
^debian/ruby-linux-netlink$ ^debian/liblinux-netlink-ruby(1.8|1.9.1)?$
~$ ~$
^.config-liblinux-netlink-ruby ^.config-liblinux-netlink-ruby
^debian/files$ ^debian/files$

24
debian/changelog vendored
View File

@@ -1,8 +1,26 @@
linux-netlink-ruby (0.11-1+wheezy1) stable; urgency=low linux-netlink-ruby (0.14-1+squeeze1) oldstable; urgency=low
* New upstream version, repackaged for wheezy. * New upstream release.
-- Patrick J Cherry <patrick@bytemark.co.uk> Fri, 05 Jul 2013 13:57:06 +0100 -- Patrick J Cherry <patrick@bytemark.co.uk> Thu, 14 Nov 2013 11:59:05 +0000
linux-netlink-ruby (0.13-1+squeeze1) oldstable; urgency=low
* New upstream release.
-- Patrick J Cherry <patrick@bytemark.co.uk> Wed, 13 Nov 2013 16:15:43 +0000
linux-netlink-ruby (0.12-1+squeeze1) oldstable; urgency=low
* New upstream release.
-- Patrick J Cherry <patrick@bytemark.co.uk> Thu, 12 Sep 2013 14:28:10 +0100
linux-netlink-ruby (0.11-1+squeeze1) oldstable; urgency=low
* New upstream version.
-- Patrick J Cherry <patrick@bytemark.co.uk> Fri, 05 Jul 2013 13:52:09 +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

@@ -3,16 +3,37 @@ 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 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: any 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,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 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

@@ -58,6 +58,8 @@ module Linux
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
@@ -123,6 +125,15 @@ module Linux
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
@@ -152,6 +163,7 @@ 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
@@ -188,6 +200,12 @@ 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
@@ -205,6 +223,7 @@ 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
@@ -238,6 +257,24 @@ module Linux
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,22 +287,27 @@ 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
@@ -287,7 +329,7 @@ module Linux
IFA_F_TENTATIVE = 0x40 IFA_F_TENTATIVE = 0x40
IFA_F_PERMANENT = 0x80 IFA_F_PERMANENT = 0x80
# 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

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

@@ -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.12"
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"]
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

@@ -16,11 +16,12 @@ class TestAddr < Test::Unit::TestCase
context "With netlink route socket" do context "With netlink route socket" do
setup do setup do
@ip = $ip @ip = $ip
@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
@@ -38,13 +39,11 @@ 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
@@ -53,6 +52,9 @@ class TestAddr < Test::Unit::TestCase
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?
return unless link.linkinfo and "dummy" == link.linkinfo.kind
# #
# Bring the link up # Bring the link up
# #
@@ -71,6 +73,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,7 +90,11 @@ 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
@@ -95,11 +102,27 @@ class TestAddr < Test::Unit::TestCase
end end
end end
test "Add and remove dummy interface" do def do_skip(msg)
ifname = create_test_interface if self.respond_to?(:skip)
return if ifname.nil? skip msg
else
puts "Skipping #{self.method_name} -- #{msg}"
end
return nil
end
delete_test_interface(ifname) 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 +130,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 +184,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 +219,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