From d13662268b0eafcaf689516ca5f8c5fc76f87d49 Mon Sep 17 00:00:00 2001 From: Brian Candler Date: Tue, 3 May 2011 17:17:15 +0100 Subject: [PATCH] routes.get --- examples/route_hi.rb | 3 +++ lib/netlink/nlsocket.rb | 4 ++-- lib/netlink/route/route_handler.rb | 9 +++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/examples/route_hi.rb b/examples/route_hi.rb index cca0f33..e7b2ded 100644 --- a/examples/route_hi.rb +++ b/examples/route_hi.rb @@ -22,3 +22,6 @@ pp rt.routes.list(:family=>Socket::AF_INET, :table=>Netlink::RT_TABLE_MAIN).to_a puts "\nDefault route is probably:" pp rt.routes.list(:family=>Socket::AF_INET, :table=>Netlink::RT_TABLE_MAIN). min_by { |route| route.dst_len } + +puts "\nTraffic to 192.168.1.1 goes out via:" +puts rt.ifname(rt.routes.get(:dst=>"192.168.1.1").oif) diff --git a/lib/netlink/nlsocket.rb b/lib/netlink/nlsocket.rb index 99bca53..0489cc4 100644 --- a/lib/netlink/nlsocket.rb +++ b/lib/netlink/nlsocket.rb @@ -128,10 +128,10 @@ module Netlink # an exception if any error message is returned, or on timeout. # # (Compare: rtnl_talk in lib/libnetlink.c, with answer=NULL) - def cmd(type, msg, flags=NLM_F_REQUEST, 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) receive_responses(true, timeout) do |type,msg| - return if type == NLMSG_ERROR + return msg if type == resp_type false end end diff --git a/lib/netlink/route/route_handler.rb b/lib/netlink/route/route_handler.rb index 7b89576..9b9a408 100644 --- a/lib/netlink/route/route_handler.rb +++ b/lib/netlink/route/route_handler.rb @@ -138,6 +138,15 @@ module Netlink def delete(opt) iproute_modify(RTM_DELROUTE, 0, opt) end + + # Get route matching given criteria + def get(msg) + msg = RT.new(msg) + raise "Missing :dst" unless msg.dst + msg.iif = index(msg.iif) if msg.iif.is_a?(String) + msg.oif = index(msg.oif) if msg.oif.is_a?(String) + @rtsocket.cmd RTM_GETROUTE, msg, NLM_F_REQUEST, RTM_NEWROUTE + end def iproute_modify(code, flags, msg) #:nodoc: msg = RT.new(msg)