Sha256: cd7284093b15085010fe42d2cab3612145ea65476fa723e169f33064fb7cd1f2

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

require 'ipaddr'

class RIB
	class Route
		attr_reader :proto, :dst, :prefixlen, :nh, :interface

		def initialize(proto, dst, nh, interface)
			dst = ip_address_normalize(dst)
			@proto     = proto
			@dst       = dst
			@prefixlen = prefixlen_get(dst)
			@nh        = nh
			@interface = interface
		end

		def prefixlen_get(dst)
			return dst.split('/')[1].to_i
		end
		private :prefixlen_get

		def ip_address_normalize(dst)
			# XXX IPv4 dependent...
			n = dst.count('.')
			case n
			when 0, 1, 2
				ia = dst.split('/')[0]
				for i in 1..3 - n do
					ia += '.0'
				end
				dst = "#{ia}/#{prefixlen_get(dst)}"
			when 3
			else
				raise(ArgumentError,
				    "Invalid IP address: #{dst}")
			end
			return dst
		end
		private :ip_address_normalize

		def tunnel?
			@interface =~ /^[tT]unnel/
		end

		def compare(other)
			return self if ! other
			if defined?(PREFERRED_NEXTHOPS)
				PREFERRED_NEXTHOPS.each do |prefix|
					ir = IPAddr.new(prefix)
					if ir.include?(@nh) &&
					    ! ir.include?(other.nh)
						return self
					elsif ! ir.include?(@nh) &&
					    ir.include?(other.nh)
						return other
					end
				end
			end
			return other if @prefixlen < other.prefixlen
			return self
		end
	end

	def initialize
		@rib = []
	end

	def add(proto, dst, nh, interface)
		@rib.push(Route.new(proto, dst, nh, interface))
	end

	def get(dst, proto = nil)
		m = []
		@rib.each do |r|
			next if proto && r.proto != proto
			m.push(r) if IPAddr.new(r.dst).include?(dst)
		end
		return nil if m.empty?
		return m
	end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
netutils-0.1.2 lib/netutils/rib.rb
netutils-0.1.1 lib/netutils/rib.rb