示例#1
0
int main(int argc, char **argv)
{
  mesh_t meshA = mesh_new();
  fail_unless(meshA);
  mesh_on_link(meshA, "test", link_check); // testing the event being triggered
  lob_t secretsA = mesh_generate(meshA);
  fail_unless(secretsA);

  mesh_t meshB = mesh_new();
  fail_unless(meshB);
  lob_t secretsB = mesh_generate(meshB);
  fail_unless(secretsB);
  
  net_loopback_t pair = net_loopback_new(meshA,meshB);
  fail_unless(pair);
  
  link_t linkAB = link_get(meshA, meshB->id);
  link_t linkBA = link_get(meshB, meshA->id);
  fail_unless(linkAB);
  fail_unless(linkBA);

  fail_unless(link_resync(linkAB));
  fail_unless(link_up(linkAB));
  fail_unless(link_up(linkBA));
  fail_unless(status);
  
  fail_unless(mesh_process(meshA,1));
  fail_unless(mesh_linked(meshA, hashname_char(meshB->id),0));
  fail_unless(mesh_unlink(linkAB));
  fail_unless(mesh_process(meshA,1));
  fail_unless(!mesh_linked(meshA, hashname_char(meshB->id),0));
  fail_unless(!status);

  return 0;
}
示例#2
0
// process an incoming handshake
link_t link_receive_handshake(link_t link, lob_t inner)
{
  uint32_t out, at, err;
  uint8_t csid = 0;
  lob_t outer = lob_linked(inner);

  if(!link || !inner || !outer) return LOG("bad args");

  // inner/link must be validated by caller already, we just load if missing
  if(!link->key)
  {
    util_unhex(lob_get(inner, "csid"), 2, &csid);
    if(!link_load(link, csid, inner))
    {
      lob_free(inner);
      return LOG("load key failed for %s %u %s",hashname_short(link->id),csid,util_hex(inner->body,inner->body_len,NULL));
    }
  }

  if((err = e3x_exchange_verify(link->x,outer)))
  {
    lob_free(inner);
    return LOG("handshake verification fail: %d",err);
  }

  out = e3x_exchange_out(link->x,0);
  at = lob_get_uint(inner,"at");
  link_t ready = link_up(link);

  // if bad at, always send current handshake
  if(e3x_exchange_in(link->x, at) < out)
  {
    LOG("old handshake: %s (%d,%d,%d)",lob_json(inner),at,out);
    link_sync(link);
    lob_free(inner);
    return link;
  }

  // try to sync ephemeral key
  if(!e3x_exchange_sync(link->x,outer))
  {
    lob_free(inner);
    return LOG("sync failed");
  }

  // we may need to re-sync
  if(out != e3x_exchange_out(link->x,0)) link_sync(link);

  // notify of ready state change
  if(!ready && link_up(link))
  {
    LOG("link ready");
    mesh_link(link->mesh, link);
  }

  link->handshake = lob_free(link->handshake);
  link->handshake = inner;
  return link;
}
示例#3
0
// process an incoming handshake
link_t link_receive_handshake(link_t link, lob_t inner, pipe_t pipe)
{
  link_t ready;
  uint32_t out, err;
  seen_t seen;
  uint8_t csid = 0;
  char *hexid;
  lob_t attached, outer = lob_linked(inner);

  if(!link || !inner || !outer) return LOG("bad args");
  hexid = lob_get(inner, "csid");
  if(!lob_get(link->mesh->keys, hexid)) return LOG("unsupported csid %s",hexid);
  util_unhex(hexid, 2, &csid);
  attached = lob_parse(inner->body, inner->body_len);
  if(!link->key && link_key(link->mesh, attached, csid) != link) return LOG("invalid/mismatch link handshake");
  if((err = e3x_exchange_verify(link->x,outer))) return LOG("handshake verification fail: %d",err);

  out = e3x_exchange_out(link->x,0);
  ready = link_up(link);

  // if bad at, always send current handshake
  if(e3x_exchange_in(link->x, lob_get_uint(inner,"at")) < out)
  {
    LOG("old/bad at: %s (%d,%d,%d)",lob_json(inner),lob_get_int(inner,"at"),e3x_exchange_in(link->x,0),e3x_exchange_out(link->x,0));
    // just reset pipe seen and call link_sync to resend handshake
    for(seen = link->pipes;pipe && seen;seen = seen->next) if(seen->pipe == pipe) seen->at = 0;
    lob_free(link_sync(link));
    return NULL;
  }

  // trust/add this pipe
  if(pipe) link_pipe(link,pipe);

  // try to sync ephemeral key
  if(!e3x_exchange_sync(link->x,outer)) return LOG("sync failed");
  
  // we may need to re-sync
  if(out != e3x_exchange_out(link->x,0)) lob_free(link_sync(link));
  
  // notify of ready state change
  if(!ready && link_up(link))
  {
    LOG("link ready");
    mesh_link(link->mesh, link);
  }
  
  return link;
}
示例#4
0
// force link down, end channels and generate all events
link_t link_down(link_t link)
{
  if(!link) return NULL;

  LOG("forcing link down for %s",hashname_short(link->id));

  // generate down event if up
  if(link_up(link))
  {
    e3x_exchange_down(link->x);
    mesh_link(link->mesh, link);
  }

  // end all channels
  chan_t c, cnext;
  for(c = link->chans;c;c = cnext)
  {
    cnext = chan_next(c);
    chan_err(c, "disconnected");
    chan_process(c, 0);
  }

  // remove pipe
  if(link->send_cb)
  {
    link->send_cb(link, NULL, link->send_arg); // notify jic
    link->send_cb = NULL;
    link->send_arg = NULL;
  }

  return NULL;
}
示例#5
0
文件: port.c 项目: dalent/trema
/*
 * Tests if the link and port are both up.
 *
 * @return [Boolean] true if link is up otherwise false.
 */
static VALUE
port_and_link_up( VALUE self ) {
  if ( port_up( self ) == Qtrue && link_up( self ) == Qtrue ) {
    return Qtrue;
  }
  return Qfalse;
}
示例#6
0
文件: socket_app.c 项目: antontest/c
/**
 * @brief linkstatd -- monitor interface status
 *
 * @param link_up   [in] callback when link up
 * @param link_down [in] callback when link down
 *
 * @return 0, if succ; -1, if failed
 */
int linkstatd(void (*link_up)(const char *ifname), void (*link_down)(const char *ifname))
{
    int fd = -1;
    char ifname[64] = {0};
    char msg[1024] = {0};
    struct sockaddr_nl sa = {0};
    struct ifinfomsg *ifi = NLMSG_DATA(msg);

    sa.nl_family = AF_NETLINK;
    sa.nl_groups = RTMGRP_LINK;

    if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0)
        perror("linkstatd socket create");
    
    socket_bind(fd, (struct sockaddr *)&sa);

    while (read(fd, msg, sizeof(msg)))
    {
        if_indextoname(ifi->ifi_index, ifname);
        if (ifi->ifi_flags & IFF_RUNNING)
        {
            if (link_up != NULL) link_up(ifname);
        }
        else 
        {
            if (link_up != NULL) link_down(ifname);
        }
    }

    return 0;
}
示例#7
0
bool DwPcie::IsLinkUp() {
    auto phyDebugR1 = PortLogic::DebugR1::Get().ReadFrom(&dbi_);

    const bool isLinkUp = phyDebugR1.link_up();
    const bool isLinkTraining = phyDebugR1.link_in_training();

    return isLinkUp && !isLinkTraining;
}
示例#8
0
void link_check(link_t link)
{
  status = link_up(link) ? 1 : 0;
  LOG("link state change to %s",status?"up":"down");
}
示例#9
0
static int connect_pppoe_ses(void)
{
    int err=-1;
    int rcvbuf; //brcm
    
    // cwu
#if 0
    if( pppoe_server == 1 ){
	srv_init_ses(ses,devnam);
    }else{
	client_init_ses(ses,devnam);
    }
#endif
    client_init_ses(ses,devnam);
    
#if 0
    ses->np=1;  /* jamal debug the discovery portion */
#endif
    strlcpy(ppp_devnam, devnam, sizeof(ppp_devnam));

	//brcm
    if (disc_sock > 0) {
	    rcvbuf=5000;
        setsockopt(disc_sock, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));
    }    
    err= session_connect ( ses );

	/* 
	*  brcm, after pppoe session is up, we don't read disc_sock, 
	*  reduce socket rx buffer to avoid to exhaust all rx buffer 
	*/
    if (disc_sock > 0) {
	    rcvbuf=256;
        setsockopt(disc_sock, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));
    }    

    if(err < 0){
	if (!link_up(devnam)) 
	    return 0;
	else if (!get_sock_intf(devnam))
	    return 0;
	else
    	    poe_fatal(ses,"Failed to negotiate PPPoE connection: %d %m",errno,errno);
    }

    // cwu
    /*
    poe_info(ses,"Connecting PPPoE socket: %E %04x %s %p",
	     ses->sp.sa_addr.pppoe.remote,
	     ses->sp.sa_addr.pppoe.sid,
	     ses->sp.sa_addr.pppoe.dev,ses);
    */
    
    err = connect(ses->fd, (struct sockaddr*)&ses->sp,
		  sizeof(struct sockaddr_pppox));


    if( err < 0 ){
	poe_fatal(ses,"Failed to connect PPPoE socket: %d %m",errno,errno);
	return err;
    }
#if 0
    if (ses->np)
     	fatal("discovery complete\n");
#endif
    /* Once the logging is fixed, print a message here indicating
       connection parameters */

    return ses->fd;
}
示例#10
0
文件: port.c 项目: dalent/trema
/*
 * Tests if the link is down.
 *
 * @return [Boolean] true if link is down otherwise false.
 */
static VALUE
link_down( VALUE self ) {
  return link_up( self ) == Qfalse ? Qtrue : Qfalse;
}
void handle_input(char *input, char *itc_file , int node_id)
{

      int quit_len;
      char *inp_ptr; 
      pthread_t thread;  
      int srv_len  = strlen("start_service");
      int exit_len = strlen("exit");   
      int stop_srv_len  = strlen("stop_service"); 
      int connect_len  = strlen("connect");
      int download_len = strlen("download");
      int dump_len    = strlen("route_table");
      int set_gar_len  =  strlen("set_garbler");
      int link_up_len   = strlen("link_up"); 
      int link_down_len  = strlen("link_down");  
      char file_name[NAME_MAX];
      int max_connections; 
      char *app_buffer= (char *)malloc(APP_HEADER_SIZE);
      int code;  
      int dest_node;
      int window_size;    

        

      quit_len  = strlen("quit");
      inp_ptr   = input; 
      srand(time(NULL));   
      if ( strncmp(input,"quit",quit_len) == 0 )
      {
            printf("\n Quiting ...  \n"); 
            exit(EXIT_SUCCESS);  

      }
      if ( strncmp(input,"exit",exit_len) == 0 )
      {
            printf("\n Quiting ...  \n"); 
            exit(EXIT_SUCCESS);  

      } 
      if ( strncmp(input,"start_service",srv_len) == 0 )
      {
            printf("\n Starting Server Thread : SID  = %d \n"  , rand()% 10000 );  
            inp_ptr += srv_len ;
	    sscanf(inp_ptr,"%d", &max_connections); 
            printf("\n Max connections = %d \n" , max_connections ); 
	    init_state(&__max_connections); 
	    set_state(&__max_connections,max_connections);
	    handle_start_server(itc_file , node_id , inp_ptr , &thread);   
      }     
      if ( strncmp(input,"stop_service",stop_srv_len) == 0 )
      {
           printf("\n  stoping the serivce  ... \n");      
           pthread_cancel(thread);     

      }	      
      if ( strncmp(input,"connect",connect_len) == 0)
      {

              
	      inp_ptr +=  connect_len;
	      sscanf(inp_ptr,"%d",&dest_node);
	      sscanf(inp_ptr,"%d",&window_size);          
	      nfd_send_buffer_transport("Donkey!" ,8,2); 

      
      }   
      if ( strncmp(input,"route_table",dump_len) == 0)
      {
           dump_route_table();    
	   printf("\n Route table dumped to file \n");  
      }
      if ( strncmp(input,"link_up",link_up_len) == 0)
      {
	   inp_ptr+=link_up_len;    
           sscanf(inp_ptr,"%d",&dest_node);  
	   link_up(dest_node); 
	   printf("\n Link upped :) \n");  
      }
      if ( strncmp(input,"link_down",link_down_len) == 0)
      {
           inp_ptr += link_down_len; 
           sscanf(inp_ptr,"%d",&dest_node); 	   
           link_down(dest_node); 
	   printf("\n Link downed!\n");  
      }
      if ( strncmp(input,"download",download_len) == 0 )
      {

	     inp_ptr += download_len;  
             sscanf(inp_ptr , "%d%s" , &dest_node , file_name); 
             code = CODE_GET ; 	     
	     pack_into_packet(app_buffer, CODE_OFFSET , &code , CODE_SIZE); 
             pack_into_packet(app_buffer ,FILENAME_OFFSET , file_name , strlen(file_name) +1 );
	     printf("\n Currnet node = %d "  , __current_node );
	     pack_into_packet(app_buffer , SRC_ID_OFFSET , &__current_node , SRC_ID_SIZE);
	     nfd_send_buffer_transport(app_buffer,APP_HEADER_SIZE,dest_node); 

      }  
      if ( strncmp(input,"set_garbler",set_gar_len) == 0)
      {

              
	      inp_ptr +=  connect_len;
	      sscanf(inp_ptr,"%d%d",&__loss_frac , &__corr_fact);
	      fprintf(stderr ,"\n garbler charecteristics set ... \n");         

      
      }
}