anchor.diff:    {stop, Reason :: term(), Reply :: term(), NewState :: #state{}} |
     {stop, Reason :: term(), NewState :: #state{}}).
   %% TODO: Caching.
  -handle_call({get_route, Addr}, _From, State = #state{socket = Socket}) ->
  -  Reply = handle_get_route(Addr, Socket),
  +handle_call({get_route, Addr}, _From, State = #state{socket = Socket, table_id = TableID}) ->
  +  Reply = handle_get_route(Addr, Socket, TableID),
     {reply, Reply, State};
   handle_call(_Request, _From, State) ->
     {reply, ok, State}.
  
positive.code:   {ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} |
    {stop, Reason :: term()} | ignore).
  init([]) ->
    %% TODO: Return error, don't just bail
    {unix, linux} = os:type(),
    {ok, Socket} = gen_socket:socket(netlink, raw, ?NETLINK_ROUTE),
  
negative.code: -include_lib("gen_socket/include/gen_socket.hrl").
  -include_lib("gen_netlink/include/netlink.hrl").
  -define(SERVER, ?MODULE).
  -define(ROUTE_CACHE_TIME_SECONDS, 10).
  
  -record(route_cache, {addr = {0, 0, 0, 0} :: inet:ip4_address(), timestamp = 0 :: integer(), route = [] :: nla()}).
  -record(state, {socket = erlang:error() :: gen_socket:socket(), table_id = erlang:error() :: ets:tid()}).
  %% TODO: define a route,
  %% They look roughly like:
  %[{dst,{8,8,8,8}},
  