diff --git a/lib/netlink/constants.rb b/lib/netlink/constants.rb index bb7fc16..0391c58 100644 --- a/lib/netlink/constants.rb +++ b/lib/netlink/constants.rb @@ -64,10 +64,6 @@ module Netlink NLA_ALIGNTO = 4 # from linux/rtnetlink.h. - # Should we put each of these groups under separate namespace? - # Netlink::Message::GETROUTE - # Netlink::Route::Type::UNICAST - # Netlink::Route::Protocol::STATIC RTM_NEWLINK = 16 RTM_DELLINK = 17 RTM_GETLINK = 18 @@ -123,7 +119,6 @@ module Netlink RTM_SETDCB = 79 # Route#type - RTN_UNSPEC = 0 RTN_UNICAST = 1 RTN_LOCAL = 2 @@ -138,15 +133,42 @@ module Netlink RTN_XRESOLVE = 11 # Route#protocol - RTPROT_UNSPEC = 0 RTPROT_REDIRECT = 1 RTPROT_KERNEL = 2 RTPROT_BOOT = 3 RTPROT_STATIC = 4 + RTPROT_GATED = 8 + RTPROT_RA = 9 + RTPROT_MRT = 10 + RTPROT_ZEBRA = 11 + RTPROT_BIRD = 12 + RTPROT_DNROUTED = 13 + RTPROT_XORP = 14 + RTPROT_NTK = 15 + RTPROT_DHCP = 16 - # XXXX MORE TO GO + # Route#scope, Addr#scope + RT_SCOPE_UNIVERSE = 0 + RT_SCOPE_SITE = 200 + RT_SCOPE_LINK = 253 + RT_SCOPE_HOST = 254 + RT_SCOPE_NOWHERE = 255 + # Route#flags + RTM_F_NOTIFY = 0x100 + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_PREFIX = 0x800 + + # Route#table (reserved values) + RT_TABLE_UNSPEC = 0 + RT_TABLE_COMPAT = 252 + RT_TABLE_DEFAULT = 253 + RT_TABLE_MAIN = 254 + RT_TABLE_LOCAL = 255 + + # routing message attributes RTA_UNSPEC = 0 RTA_DST = 1 RTA_SRC = 2 @@ -198,4 +220,56 @@ module Netlink IFA_ANYCAST = 5 IFA_CACHEINFO = 6 IFA_MULTICAST = 7 + + IFA_F_SECONDARY = 0x01 + IFA_F_TEMPORARY = IFA_F_SECONDARY + IFA_F_NODAD = 0x02 + IFA_F_OPTIMISTIC = 0x04 + IFA_F_DADFAILED = 0x08 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_DEPRECATED = 0x20 + IFA_F_TENTATIVE = 0x40 + IFA_F_PERMANENT = 0x80 + + # from linux/if_arp.h + ARPHRD_NETROM = 0 + ARPHRD_ETHER = 1 + ARPHRD_EETHER = 2 + ARPHRD_AX25 = 3 + ARPHRD_PRONET = 4 + ARPHRD_CHAOS = 5 + ARPHRD_IEEE802 = 6 + ARPHRD_ARCNET = 7 + ARPHRD_APPLETLK = 8 + ARPHRD_DLCI = 15 + ARPHRD_ATM = 19 + ARPHRD_METRICOM = 23 + ARPHRD_IEEE1394 = 24 + ARPHRD_EUI64 = 27 + ARPHRD_INFINIBAND = 32 + ARPHRD_LOOPBACK = 772 + # ... others to be added as required + + # linux/if.h + IFF_UP = 0x1 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LOOPBACK = 0x8 + IFF_POINTOPOINT = 0x10 + IFF_NOTRAILERS = 0x20 + IFF_RUNNING = 0x40 + IFF_NOARP = 0x80 + IFF_PROMISC = 0x100 + IFF_ALLMULTI = 0x200 + IFF_MASTER = 0x400 + IFF_SLAVE = 0x800 + IFF_MULTICAST = 0x1000 + IFF_PORTSEL = 0x2000 + IFF_AUTOMEDIA = 0x4000 + IFF_DYNAMIC = 0x8000 + IFF_LOWER_UP = 0x10000 + IFF_DORMANT = 0x20000 + IFF_ECHO = 0x40000 + IFF_VOLATILE = (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\ + IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT) end diff --git a/lib/netlink/message.rb b/lib/netlink/message.rb index 5957481..a34a460 100644 --- a/lib/netlink/message.rb +++ b/lib/netlink/message.rb @@ -226,12 +226,12 @@ module Netlink class Link < RtattrMessage code RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK - field :family, :uchar + field :family, :uchar # Socket::AF_* field :pad, :uchar - field :type, :ushort + field :type, :ushort # ARPHRD_* field :index, :int - field :flags, :uint - field :change, :uint + field :flags, :uint # IFF_* + field :change, :uint, :default=>0xffffffff rtattr :address, IFLA_ADDRESS rtattr :broadcast, IFLA_BROADCAST rtattr :ifname, IFLA_IFNAME, :cstring @@ -260,10 +260,10 @@ module Netlink class Addr < RtattrMessage code RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR - field :family, :uchar + field :family, :uchar # Socket::AF_* field :prefixlen, :uchar - field :flags, :uchar - field :scope, :uchar + field :flags, :uchar # IFA_F_* + field :scope, :uchar # RT_SCOPE_* field :index, :int rtattr :address, IFA_ADDRESS, :l3addr rtattr :local, IFA_LOCAL, :l3addr @@ -276,15 +276,15 @@ module Netlink class Route < RtattrMessage code RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE - field :family, :uchar + field :family, :uchar # Socket::AF_* field :dst_len, :uchar field :src_len, :uchar field :tos, :uchar - field :table, :uchar - field :protocol, :uchar - field :scope, :uchar - field :type, :uchar - field :flags, :uint + field :table, :uchar # table id or RT_TABLE_* + field :protocol, :uchar # RTPROT_* + field :scope, :uchar # RT_SCOPE_* + field :type, :uchar # RTN_* + field :flags, :uint # RTM_F_* rtattr :dst, RTA_DST, :l3addr rtattr :src, RTA_SRC, :l3addr rtattr :iif, RTA_IIF, :uint32 diff --git a/lib/netlink/rtsocket.rb b/lib/netlink/rtsocket.rb index 4acb337..598e0b2 100644 --- a/lib/netlink/rtsocket.rb +++ b/lib/netlink/rtsocket.rb @@ -93,8 +93,10 @@ if __FILE__ == $0 addrs = nl.addrs_by_index(:family=>Socket::AF_UNSPEC) routes = nl.routes_by_oif(:family=>Socket::AF_UNSPEC) links.each do |link| + #p link puts "#{link.ifname}" addrs[link.index].each do |addr| + #p addr puts " family=#{addr.family} #{addr.address}/#{addr.prefixlen} label=#{addr.label}" end routes[link.index].each do |route|