Пример #1
0
void update_grid_from_edit(int edit_iItem, int edit_iSubItem)
{
    TCHAR buf[64];
    t_stream* pt_stream=g_apt_streams[edit_iItem];
    t_ether_packet *pt_eth_hdr = (void *)pt_stream->data;
    t_ip_hdr *iph=eth_data(pt_eth_hdr);
    t_ipv6_hdr *ip6h=(void *)iph;
    int type = eth_type(pt_eth_hdr);

    GetWindowText(hwnd_dynamic_edit, buf, sizeof(buf));
    ShowWindow (hwnd_dynamic_edit, 0);
    ListView_SetItemText(hwnd_lv, edit_iItem, edit_iSubItem, buf);
    if (edit_iSubItem==3)
    {
        strcpy(pt_stream->name, buf);
        return;
    }

    if (edit_iSubItem==7)
    {
        pt_stream->len = atoi(buf);
        goto exit;
    }

    if (type!=ETH_P_IP && type!=ETH_P_IPV6)
    {
        if (edit_iSubItem==4)
        {
            mac_str2n(pt_stream->eth_packet.src, buf);
        }
        else if (edit_iSubItem==5)
        {
            mac_str2n(pt_stream->eth_packet.dst, buf);
        }
        return;
    }

    if (edit_iSubItem==4)
    {
        if (type==ETH_P_IP)
            ip_str2n(&(iph->saddr), buf);
        else
            ip6_str2n(ip6h->saddr, buf);
    }
    else if (edit_iSubItem==5)
    {
        if (type==ETH_P_IP)
            ip_str2n(&(iph->daddr), buf);
        else
            ip6_str2n(ip6h->daddr, buf);

    }

exit:
    update_stream(pt_stream);
}
Пример #2
0
/***************************************************************************
 * sl_collect_nb:
 *
 * Routine to manage a connection to a SeedLink server based on the values
 * given in the slconn struct and collect data.
 *
 * Designed to run in a tight loop at the heart of a client program, this
 * function is a non-blocking version sl_collect().  SLNOPACKET will be
 * returned when no data is available.
 *
 * Returns SLPACKET when something is received and sets the slpack
 * pointer to the received packet.  Returns SLNOPACKET when no packets
 * have been received, slpack is set to NULL.  When the connection was
 * closed by the server or the termination sequence completed
 * SLTERMINATE is returned and the slpack pointer is set to NULL.
 ***************************************************************************/
int
sl_collect_nb (SLCD * slconn, SLpacket ** slpack) 
{
  int    bytesread;
  double current_time;
  char   retpacket;

  *slpack = NULL;

  /* Check if the info was set */
  if ( slconn->info != NULL )
    {
      slconn->stat->query_mode = InfoQuery;
    }
  
  /* If the connection is not up check the SLCD and reset the timing variables */
  if ( slconn->link == -1 )
    {
      if ( sl_checkslcd(slconn) )
	{
	  sl_log_r (slconn, 2, 0, "problems with the connection description\n");
	  return SLTERMINATE;
	}

      slconn->stat->netto_trig     = -1;	   /* Init net timeout trigger to reset state */
      slconn->stat->keepalive_trig = -1;	   /* Init keepalive trigger to reset state */
    }

  /* Start the main sequence  */
  if ( ! slconn->terminate )
    {
      if (slconn->link == -1)
	{
	  slconn->stat->sl_state = SL_DOWN;
	}
      
      /* Check for network timeout */
      if (slconn->stat->sl_state == SL_DATA &&
	  slconn->netto && slconn->stat->netto_trig > 0)
	{
	  sl_log_r (slconn, 1, 0, "network timeout (%ds), reconnecting in %ds\n",
		    slconn->netto, slconn->netdly);
	  slconn->link = sl_disconnect (slconn);
	  slconn->stat->sl_state = SL_DOWN;
	  slconn->stat->netto_trig = -1;
	  slconn->stat->netdly_trig = -1;
	}
      
      /* Check if a keepalive packet needs to be sent */
      if (slconn->stat->sl_state == SL_DATA && !slconn->stat->expect_info &&
	  slconn->keepalive && slconn->stat->keepalive_trig > 0)
	{
	  sl_log_r (slconn, 1, 2, "sending keepalive request\n");
	  
	  if ( sl_send_info (slconn, "ID", 3) != -1 )
	    {
	      slconn->stat->query_mode = KeepAliveQuery;
	      slconn->stat->expect_info = 1;
	      slconn->stat->keepalive_trig = -1;
	    }
	}
      
      /* Check if an in-stream INFO request needs to be sent */
      if (slconn->stat->sl_state == SL_DATA &&
	  !slconn->stat->expect_info && slconn->info)
	{
	  if ( sl_send_info (slconn, slconn->info, 1) != -1 )
	    {
	      slconn->stat->query_mode = InfoQuery;
	      slconn->stat->expect_info = 1;
	    }
	  else
	    {
	      slconn->stat->query_mode = NoQuery;
	    }
	  
	  slconn->info = NULL;
	}
      
      /* Throttle the loop while delaying */
      if (slconn->stat->sl_state == SL_DOWN && slconn->stat->netdly_trig > 0)
	{
	  slp_usleep (500000);
	}
      
      /* Connect to remote SeedLink */
      if (slconn->stat->sl_state == SL_DOWN && slconn->stat->netdly_trig == 0)
	{
	  if (sl_connect (slconn, 1) != -1)
	    {
	      slconn->stat->sl_state = SL_UP;
	    }
	  slconn->stat->netto_trig = -1;
	  slconn->stat->netdly_trig = -1;
	  slconn->stat->keepalive_trig = -1;
	}
      
      /* Negotiate/configure the connection */
      if (slconn->stat->sl_state == SL_UP)
	{
	  int slconfret = 0;
	  
	  /* Only send query if a query is set and no streams are defined,
	   * if streams are defined we'll send the query after configuration.
	   */
	  if (slconn->info && slconn->streams == NULL)
	    {
	      if ( sl_send_info (slconn, slconn->info, 1) != -1 )
		{
		  slconn->stat->query_mode = InfoQuery;
		  slconn->stat->expect_info = 1;
		}
	      else
		{
		  slconn->stat->query_mode = NoQuery;
		  slconn->stat->expect_info = 0;
		}
	      
	      slconn->info = NULL;
	    }
	  else
	    {
	      slconfret = sl_configlink (slconn);
	      slconn->stat->expect_info = 0;
	    }
	  
	  if (slconfret != -1)
	    {
	      slconn->stat->recptr   = 0;	/* initialize the data buffer pointers */
	      slconn->stat->sendptr  = 0;
	      slconn->stat->sl_state = SL_DATA;
	    }
	  else
	    {
	      sl_log_r (slconn, 2, 0, "negotiation with remote SeedLink failed\n");
	      slconn->link = sl_disconnect (slconn);
	      slconn->stat->netdly_trig = -1;
	    }
	}
    }
  else /* We are terminating */
    {
      if (slconn->link != -1)
	{
	  slconn->link = sl_disconnect (slconn);
	}

      slconn->stat->sl_state = SL_DATA;
    }

  /* DEBUG
     sl_log_r (slconn, 1, 0, "link: %d, sendptr: %d, recptr: %d, diff: %d\n",
     slconn->link, slconn->stat->sendptr, slconn->stat->recptr,
     (slconn->stat->recptr - slconn->stat->sendptr) );
  */
        
  /* Process data in buffer */
  while (slconn->stat->recptr - slconn->stat->sendptr >= SLHEADSIZE + SLRECSIZE)
    {
      retpacket = 1;
      
      /* Check for an INFO packet */
      if (!strncmp (&slconn->stat->databuf[slconn->stat->sendptr], INFOSIGNATURE, 6))
	{
	  char terminator;
	  
	  terminator = (slconn->stat->databuf[slconn->stat->sendptr + SLHEADSIZE - 1] != '*');
	  
	  if ( !slconn->stat->expect_info )
	    {
	      sl_log_r (slconn, 2, 0, "unexpected INFO packet received, skipping\n");
	    }
	  else
	    {
	      if ( terminator )
		{
		  slconn->stat->expect_info = 0;
		}
	      
	      /* Keep alive packets are not returned */
	      if ( slconn->stat->query_mode == KeepAliveQuery )
		{
		  retpacket = 0;
		  
		  if ( !terminator )
		    {
		      sl_log_r (slconn, 2, 0, "non-terminated keep-alive packet received!?!\n");
		    }
		  else
		    {
		      sl_log_r (slconn, 1, 2, "keepalive packet received\n");
		    }
		}
	    }
	  
	  if ( slconn->stat->query_mode != NoQuery )
	    {
	      slconn->stat->query_mode = NoQuery;
	    }
	}
      else    /* Update the stream chain entry if not an INFO packet */
	{
	  if ( (update_stream (slconn, (SLpacket *) &slconn->stat->databuf[slconn->stat->sendptr])) == -1 )
	    {
	      /* If updating didn't work the packet is broken */
	      retpacket = 0;
	    }
	}
      
      /* Increment the send pointer */
      slconn->stat->sendptr += (SLHEADSIZE + SLRECSIZE);
      
      /* Return packet */
      if ( retpacket )
	{
	  *slpack = (SLpacket *) &slconn->stat->databuf[slconn->stat->sendptr - (SLHEADSIZE + SLRECSIZE)];
	  return SLPACKET;
	}
    }
  
  /* A trap door for terminating, all complete data packets from the buffer
     have been sent to the caller */
  if ( slconn->terminate ) {
    return SLTERMINATE;
  }
  
  /* After processing the packet buffer shift the data */
  if ( slconn->stat->sendptr )
    {
      memmove (slconn->stat->databuf,
	       &slconn->stat->databuf[slconn->stat->sendptr],
	       slconn->stat->recptr - slconn->stat->sendptr);
      
      slconn->stat->recptr -= slconn->stat->sendptr;
      slconn->stat->sendptr = 0;
    }
  
  /* Catch cases where the data stream stopped */
  if ((slconn->stat->recptr - slconn->stat->sendptr) == 7 &&
      !strncmp (&slconn->stat->databuf[slconn->stat->sendptr], "ERROR\r\n", 7))
    {
      sl_log_r (slconn, 2, 0, "SeedLink server reported an error with the last command\n");
      slconn->link = sl_disconnect (slconn);
      return SLTERMINATE;
    }
  
  if ((slconn->stat->recptr - slconn->stat->sendptr) == 3 &&
      !strncmp (&slconn->stat->databuf[slconn->stat->sendptr], "END", 3))
    {
      sl_log_r (slconn, 1, 1, "End of buffer or selected time window\n");
      slconn->link = sl_disconnect (slconn);
      return SLTERMINATE;
    }
  
  /* Process data in our buffer and then read incoming data */
  if (slconn->stat->sl_state == SL_DATA)
    {
      /* Check for more available data from the socket */
      bytesread = 0;
      
      bytesread = sl_recvdata (slconn, (void *) &slconn->stat->databuf[slconn->stat->recptr],
			       BUFSIZE - slconn->stat->recptr, slconn->sladdr);
      
      if (bytesread < 0 && ! slconn->terminate)            /* read() failed */
	{
	  slconn->link = sl_disconnect (slconn);
	  slconn->stat->netdly_trig = -1;
	}
      else if (bytesread > 0)	/* Data is here, process it */
	{
	  slconn->stat->recptr += bytesread;
	  
	  /* Reset the timeout and keepalive timers */
	  slconn->stat->netto_trig     = -1;
	  slconn->stat->keepalive_trig = -1;
	}
    }
  
  /* Update timing variables */
  current_time = sl_dtime ();

  /* Network timeout timing logic */
  if (slconn->netto)
    {
      if (slconn->stat->netto_trig == -1)	/* reset timer */
	{
	  slconn->stat->netto_time = current_time;
	  slconn->stat->netto_trig = 0;
	}
      else if (slconn->stat->netto_trig == 0 &&
	       (current_time - slconn->stat->netto_time) > slconn->netto)
	{
	  slconn->stat->netto_trig = 1;
	}
    }
  
  /* Keepalive/heartbeat interval timing logic */
  if (slconn->keepalive)
    {
      if (slconn->stat->keepalive_trig == -1)	/* reset timer */
	{
	  slconn->stat->keepalive_time = current_time;
	  slconn->stat->keepalive_trig = 0;
	}
      else if (slconn->stat->keepalive_trig == 0 &&
	       (current_time - slconn->stat->keepalive_time) > slconn->keepalive)
	{
	  slconn->stat->keepalive_trig = 1;
	}
    }
  
  /* Network delay timing logic */
  if (slconn->netdly)
    {
      if (slconn->stat->netdly_trig == -1)	/* reset timer */
	{
	  slconn->stat->netdly_time = current_time;
	  slconn->stat->netdly_trig = 1;
	}
      else if (slconn->stat->netdly_trig == 1 &&
	       (current_time - slconn->stat->netdly_time) > slconn->netdly)
	{
	  slconn->stat->netdly_trig = 0;
	}
    }
  
  /* Non-blocking and no data was returned */
  return SLNOPACKET;
  
}  /* End of sl_collect_nb() */