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; }
//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 }