Changeset 2736e15930ff99c94cf51978db7a21acdd218ad5

Show
Ignore:
Timestamp:
09/05/08 02:06:57 (2 years ago)
Author:
Hans Petter Jansson <hpj@kzerza.site>
git-committer:
Hans Petter Jansson <hpj@kzerza.site> 1220594817 -0500
git-parent:

[873dea3b9b9866208f1af4439b82845e5ef3155a]

git-author:
Hans Petter Jansson <hpj@cl.no> 1220594817 -0500
Message:

Accomodate UDP connect ops, and lookup both local and remote services.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • flow/flow-ip-processor.c

    r6a3636e r2736e15  
    2727#include "flow-gobject-util.h" 
    2828#include "flow-tcp-connect-op.h" 
     29#include "flow-udp-connect-op.h" 
    2930#include "flow-ip-processor.h" 
    3031 
     
    233234 
    234235static void flow_ip_processor_process_input (FlowIPProcessor *ip_processor, FlowPad *input_pad); 
     236static void current_ip_resolved             (FlowIPProcessor *ip_processor, FlowIPService *ip_service); 
     237 
     238static gboolean 
     239ip_service_is_valid (FlowIPProcessor *ip_processor, FlowIPService *ip_service) 
     240{ 
     241  FlowIPProcessorPrivate *priv = ip_processor->priv; 
     242 
     243  if (!ip_service) 
     244    return TRUE; 
     245 
     246  if (!(priv->require_addrs && flow_ip_service_get_n_addresses (ip_service) == 0) && 
     247      !(priv->require_names && !flow_ip_service_have_name (ip_service))) 
     248    return TRUE; 
     249 
     250  return FALSE; 
     251} 
    235252 
    236253static void 
    237254validate_ip_service (FlowIPProcessor *ip_processor, FlowIPService *ip_service) 
    238255{ 
    239   FlowIPProcessorPrivate *priv           = ip_processor->priv; 
     256  FlowIPProcessorPrivate *priv            = ip_processor->priv; 
    240257  gboolean                new_valid_state = FALSE; 
    241258 
    242   if ((!(priv->require_addrs && flow_ip_service_get_n_addresses (ip_service) == 0) && 
    243        !(priv->require_names && !flow_ip_service_have_name (ip_service)))) 
    244   { 
    245     new_valid_state = TRUE; 
    246   } 
     259  new_valid_state = ip_service_is_valid (ip_processor, ip_service); 
    247260 
    248261  if (priv->valid_state != new_valid_state) 
     
    251264    flow_ip_processor_set_valid_state (ip_processor, new_valid_state); 
    252265  } 
     266} 
     267 
     268static void 
     269validate_two_ip_services (FlowIPProcessor *ip_processor, FlowIPService *ip_service_a, FlowIPService *ip_service_b) 
     270{ 
     271  FlowIPProcessorPrivate *priv            = ip_processor->priv; 
     272  gboolean                new_valid_state = FALSE; 
     273 
     274  /* If one of the IP services is bad, the whole thing goes down the drain */ 
     275  new_valid_state = ip_service_is_valid (ip_processor, ip_service_a); 
     276  if (new_valid_state) 
     277    new_valid_state = ip_service_is_valid (ip_processor, ip_service_b); 
     278 
     279  if (priv->valid_state != new_valid_state) 
     280  { 
     281    /* Must use property setter, so property change listeners get called */ 
     282    flow_ip_processor_set_valid_state (ip_processor, new_valid_state); 
     283  } 
     284} 
     285 
     286static gboolean 
     287start_lookup_ip_service (FlowIPProcessor *ip_processor, FlowIPService *ip_service, FlowPacket *packet) 
     288{ 
     289  FlowIPProcessorPrivate *priv = ip_processor->priv; 
     290 
     291  g_assert (priv->current_packet == NULL); 
     292 
     293  if (((priv->resolve_to_addrs && flow_ip_service_get_n_addresses (ip_service) == 0) || 
     294       (priv->resolve_to_names && !flow_ip_service_have_name (ip_service)))) 
     295  { 
     296    /* Need to do a lookup */ 
     297    priv->current_packet = packet; 
     298 
     299    g_signal_connect_swapped (ip_service, "resolved", (GCallback) current_ip_resolved, ip_processor); 
     300    flow_ip_service_resolve (ip_service); 
     301    return TRUE; 
     302  } 
     303 
     304  return FALSE; 
     305} 
     306 
     307static FlowIPService * 
     308get_udp_connect_op_local_service_if_applicable (FlowUdpConnectOp *udp_connect_op) 
     309{ 
     310  FlowIPService *ip_service; 
     311 
     312  ip_service = flow_udp_connect_op_get_local_service (udp_connect_op); 
     313 
     314  if (ip_service && 
     315      !flow_ip_service_get_n_addresses (ip_service) && 
     316      !flow_ip_service_have_name (ip_service)) 
     317  { 
     318    /* A port-only local bind address is always valid */ 
     319    ip_service = NULL; 
     320  } 
     321 
     322  return ip_service; 
    253323} 
    254324 
     
    261331  FlowPad                *output_pad = g_ptr_array_index (element->output_pads, 0); 
    262332  FlowPacket             *packet; 
     333  gpointer                packet_data; 
    263334 
    264335  packet = priv->current_packet; 
     
    269340  g_signal_handlers_disconnect_by_func (ip_service, current_ip_resolved, ip_processor); 
    270341 
    271   validate_ip_service (ip_processor, ip_service); 
     342  packet_data = flow_packet_get_data (packet); 
     343 
     344  if (FLOW_IS_UDP_CONNECT_OP (packet_data)) 
     345  { 
     346    FlowIPService *udp_remote_service = flow_udp_connect_op_get_remote_service (packet_data); 
     347    FlowIPService *udp_local_service  = get_udp_connect_op_local_service_if_applicable (packet_data); 
     348 
     349    /* If necessary, start second step of UDP remote/local service lookup */ 
     350    if (udp_local_service && ip_service != udp_local_service && 
     351        start_lookup_ip_service (ip_processor, udp_local_service, packet)) 
     352      return; 
     353 
     354    validate_two_ip_services (ip_processor, udp_remote_service, udp_local_service);  
     355  } 
     356  else 
     357  { 
     358    validate_ip_service (ip_processor, ip_service); 
     359  } 
    272360 
    273361  if (priv->valid_state || !priv->drop_invalid_ip_services) 
     
    317405      else if (FLOW_IS_TCP_CONNECT_OP (packet_data)) 
    318406        ip_service = flow_tcp_connect_op_get_remote_service (packet_data); 
     407      else if (FLOW_IS_UDP_CONNECT_OP (packet_data)) 
     408      { 
     409        /* We'll look up the local service later */ 
     410        ip_service = flow_udp_connect_op_get_remote_service (packet_data); 
     411        if (!ip_service) 
     412          ip_service = get_udp_connect_op_local_service_if_applicable (packet_data); 
     413      } 
    319414 
    320415      if (ip_service) 
    321416      { 
    322         if (((priv->resolve_to_addrs && flow_ip_service_get_n_addresses (ip_service) == 0) || 
    323              (priv->resolve_to_names && !flow_ip_service_have_name (ip_service)))) 
    324         { 
    325           /* Need to do a lookup */ 
    326           priv->current_packet = packet; 
    327  
    328           g_signal_connect_swapped (ip_service, "resolved", (GCallback) current_ip_resolved, ip_processor); 
    329           flow_ip_service_resolve (ip_service); 
     417        if (start_lookup_ip_service (ip_processor, ip_service, packet)) 
    330418          break; 
    331         } 
    332419 
    333420        /* No lookup needed; see if the IP service is valid according to our criteria */