Пример #1
0
int
isis_recv_pdu_p2p (struct isis_circuit *circuit, u_char * ssnpa)
{
  int bytesread, addr_len;
  struct sockaddr_ll s_addr;

  memset (&s_addr, 0, sizeof (struct sockaddr_ll));
  addr_len = sizeof (s_addr);

  /* we can read directly to the stream */
  bytesread = stream_recvfrom (circuit->rcv_stream, circuit->fd,
                               circuit->interface->mtu, 0,
                               (struct sockaddr *) &s_addr, 
                               (socklen_t *) &addr_len);

  if (s_addr.sll_pkttype == PACKET_OUTGOING)
    {
      /*  Read the packet into discard buff */
      bytesread = recvfrom (circuit->fd, discard_buff, sizeof (discard_buff),
                            MSG_DONTWAIT, (struct sockaddr *) &s_addr,
                            (socklen_t *) &addr_len);
      if (bytesread < 0)
	zlog_warn ("isis_recv_pdu_p2p(): recvfrom() failed");
      return ISIS_WARNING;
    }

  /* If we don't have protocol type 0x00FE which is
   * ISO over GRE we exit with pain :)
   */
  if (ntohs (s_addr.sll_protocol) != 0x00FE)
    {
      zlog_warn ("isis_recv_pdu_p2p(): protocol mismatch(): %X",
		 ntohs (s_addr.sll_protocol));
      return ISIS_WARNING;
    }

  memcpy (ssnpa, &s_addr.sll_addr, s_addr.sll_halen);

  return ISIS_OK;
}
Пример #2
0
//start read packet, 0 one packet, 1 read again, 2 full, -1 error
int udp_read(struct peer* peer)
{
        struct peer *vpeer, *tpeer;
	int nbytes;
	int type;
	int src;
	int dst;
  	int readsize;
  	union sockunion su;
        struct sockaddr_in sin;
        int len;
        int ret;
        struct stream *s;   //replay packet  
        int tcpid;
        struct stream *rs;
        struct stream ss;

        /* Read packet header to determine type of the packet */
        //if (peer->packet_size == 0)
        peer->packet_size = MISAKA_MAX_PACKET_SIZE;

        sin = peer->dsu.sin;
        len = sizeof(struct sockaddr);

        nbytes = stream_recvfrom (peer->ibuf, peer->fd, peer->packet_size, 0, (struct sockaddr*)&sin, &len); 
        

        peer->ibuf->su.sin = sin;

  	/* If read byte is smaller than zero then error occured. */
        if (nbytes < 0) 
  	{
        
        }
  	return IO_CHECK;                   //0 get one packet
}