anchor.diff:  openflow_hub(Key, Priority, InPort, PiPorts) ->
       forward_mod (Key, Priority, InPort, PiPorts),
       [forward_mod(Key, Priority, PiPort, [InPort]) || PiPort <- PiPorts].
  +
  +% set up a tap
  +% Key - switch key
  +% Cookie - flow rule cookie (8 byte binary)
  +% Priority - flow rule priority
  +% SrcIP - source IP address to match
  +% DstIP - destination IP address to match
  +% InPort - In port to match
  +% OutPorts - ports to output to (use controller for packetins)
  +forward_pip(Key, Cookie, Priority, SrcIP, DstIP, InPort, OutPorts) when is_list(OutPorts) ->
  +    Version = version(Key),
  +    Matches = [ {in_port, <<InPort:32>>},
  +                {eth_type, <<8,0>>},
  +                {ipv4_src, list_to_binary(tuple_to_list(SrcIP))},
  +                {ipv4_dst, list_to_binary(tuple_to_list(DstIP))}  ],
  +    TableId = 0,
  +    
  +    Instructions = [{apply_actions, [{output, OutPort, no_buffer} ||
  +                                                        OutPort <- OutPorts]}],
  +    Opts = [{table_id, TableId}, {priority, Priority},
  +            {idle_timeout, 0}, {idle_timeout, 0},
  +            {cookie, Cookie},
  +            {cookie_mask, <<0,0,0,0,0,0,0,0>>}],
  +    Request = of_msg_lib:flow_add(Version, Matches, Instructions, Opts),
  +    send(Key, Request).
  
positive.code:     Version = version(Key),
      Request = of_msg_lib:flow_delete(Version, [], [{table_id, TableId}]),
      send(Key, Request).
  
  %% @equiv dns_tap(default, Priority, Port1, Port2, Port3, DnsIps)
  dns_tap(Priority, Port1, Port2, Port3, DnsIps) ->
  
negative.code:     oe_ports/0,
      oe_ports/1,
      switches/0,
      openflow_hub/4,
      forward_pip/7
  ]).
  
  -type switch_key() :: integer().
  