static int ppp_tcp_client_keepalive_timer (struct thread *thread)
{
	struct ppp_mcp_sock *peer;
    struct stream* s_new;
    
	peer = THREAD_ARG (thread);
	peer->t_keepalive = NULL;
	
	PPPD_DEBUG_TCP("Timer (keepalive timer expire), peer:%s", peer->hostname);
	s_new = stream_new(1024);
	stream_putl(s_new, 4);
    ppp_put_control_to_stream(s_new, REMARK_KEEPALIVE_CMD);
    stream_fifo_push (peer->obuf, s_new);
    MCP_WRITE_ON (peer->t_write, ppp_tcp_write, peer, peer->fd);
	MCP_TIMER_ON (peer->t_keepalive, ppp_tcp_client_keepalive_timer, peer, CLIENT_CONNECT_KEEPALIVE_TIMER);
	return 0;
}
void remark_all_ipinfo_notify_mcp(void)
{
//    struct remark_ipinfo ipinfo;
    struct ppp_mcp_sock *peer;
    struct stream* s_new;
    
    peer = g_ppp_mcp_sock;

    PPPD_DEBUG_TCP("pppd send all ip info to mcp ..");
    s_new = stream_new(1024);
    ppp_all_ipinfo_tos(s_new);
    stream_fifo_push (peer->obuf, s_new);
    
    MCP_WRITE_ON (peer->t_write, ppp_tcp_write, peer, peer->fd);
//    MCP_TIMER_ON (peer->t_wait_ipinfo_ack, ppp_tcp_wait_notify_ack_timer, peer, CLIENT_WAIT_IPINFO_ACK_TIMER);

    return;
}
void remark_bundle_notify_mcp(unsigned int ifnum, unsigned int ifunit)
{
    struct remark_bundle bundleinfo;
    struct ppp_mcp_sock *peer;
    struct stream* s_new;

    return;
    peer = g_ppp_mcp_sock;
    
    bundleinfo.master = ifnum;
    bundleinfo.slave = ifunit;

    s_new = stream_new(1024);
    stream_putl(s_new, 4 + sizeof(struct remark_bundle));
    ppp_put_control_to_stream(s_new, REMARK_BUDLE_CMD);
    stream_put(s_new, (unsigned char*)(&bundleinfo), sizeof(struct remark_bundle));
    stream_fifo_push (peer->obuf, s_new);

    MCP_WRITE_ON (peer->t_write, ppp_tcp_write, peer, peer->fd);
//    MCP_TIMER_ON (peer->t_wait_bundle_ack, ppp_tcp_wait_notify_ack_timer, peer, CLIENT_WAIT_IPINFO_ACK_TIMER);

    return;
}
Пример #4
0
int
shim_sisis_read(struct thread * thread)
{
  struct sisis_listener *listener;
  int sisis_sock;
  uint16_t length, checksum;
  int already;
  u_int ifindex;
  struct shim_interface * si;
  struct in6_addr src;
  char src_buf[INET6_ADDRSTRLEN];
  struct in6_addr dst;
  char dst_buf[INET6_ADDRSTRLEN];

  zlog_notice("Reading packet from SISIS connection!");

  /* first of all get listener pointer. */
  listener = THREAD_ARG (thread);
  sisis_sock = THREAD_FD (thread);

  stream_reset(listener->ibuf);

  if ((already = stream_get_endp(listener->ibuf)) < SVZ_OUT_HEADER_SIZE)
  {
    ssize_t nbytes;
    if (((nbytes = stream_read_try (listener->ibuf, sisis_sock, SVZ_OUT_HEADER_SIZE-already)) == 0) || (nbytes == -1))
    {
      return -1;
    }

    if(nbytes != (SVZ_OUT_HEADER_SIZE - already))
    {
      listener->read_thread = thread_add_read (master, shim_sisis_read, listener, sisis_sock);
      return 0;
    }

    already = SVZ_OUT_HEADER_SIZE;
  }

  stream_set_getp(listener->ibuf, 0);

  length = stream_getw(listener->ibuf);
  checksum = stream_getw(listener->ibuf);

  if(length > STREAM_SIZE(listener->ibuf))
  {
    struct stream * ns; 
    zlog_warn("message size exceeds buffer size");
    ns = stream_new(length);
    stream_copy(ns, listener->ibuf);
    stream_free(listener->ibuf);
    listener->ibuf = ns; 
  }

  if(already < length)
  {
    ssize_t nbytes;
    if(((nbytes = stream_read_try(listener->ibuf, sisis_sock, length-already)) == 0) || nbytes == -1) 
    {   
      return -1; 
    }   
    if(nbytes != (length-already))
    {   
      listener->read_thread = thread_add_read (master, shim_sisis_read, listener, sisis_sock);
      return 0;
    }   
  } 

  unsigned int num_of_addrs = number_of_sisis_addrs_for_process_type(SISIS_PTYPE_RIBCOMP_OSPF6);
  unsigned int num_of_listeners = number_of_listeners();
 
  zlog_notice("Number of addr: %d", num_of_addrs);
  zlog_notice("Number of listeners: %d", num_of_listeners);

  pthread_mutex_lock(&bmap_mutex);
  struct bmap * bmap = bmap_set(checksum);

  // if we added initially
  // set timer at which to recycle bmap 
  // if there are no more processes sending data
  if(bmap->count == 0)
  {
    uint16_t * chcksum_ptr = malloc(sizeof(uint16_t));
    *chcksum_ptr = checksum;
  
    listener->bmap_thread = thread_add_timer_msec (master, svz_sisis_clean_bmap, chcksum_ptr, 100);
  }

  bmap->count++;
  zlog_notice("# of streams %d for checksum %d with length %d", bmap->count, checksum, length);
 
  float received_ratio = (float)bmap->count/(float)num_of_addrs;
  stream_putw(listener->chksum_stream, checksum);
  if((received_ratio > 1.0/2.0) && !bmap->sent)
  {
    if(are_checksums_same())
    {
      zlog_notice("Checksums are all the same");

    if(primary_listener == NULL)
      primary_listener = listener;

    reset_checksum_streams();
    svz_send(listener->ibuf);
    bmap->sent = 1;
    }
    else
    {
      zlog_notice("Checksums are not all the same");
      stream_fifo_push(listener->dif, listener->ibuf);
      listener->dif_size++;
    }
  }
  else if(!bmap->sent)
  {
    zlog_notice("Not enough processes have sent their data; buffering...");
  }
  else
  {
    zlog_notice("Data has already been sent...");
  }

  if((bmap->count == num_of_addrs) && (bmap->sent))
  {
    zlog_notice("Bmap no longer needed, freeing...");

    bmap->count = 0;
    bmap->sent = 0;

    clear_checksum_streams(checksum);
    bmap_unset(checksum);
  } 
  pthread_mutex_unlock(&bmap_mutex);

  if (sisis_sock < 0) 
    /* Connection was closed during packet processing. */
    return -1; 

  /* Register read thread. */
//  stream_reset(listener->ibuf);

  /* prepare for next packet. */
  listener->read_thread = thread_add_read (master, shim_sisis_read, listener, sisis_sock);

  return 0;
}