home *** CD-ROM | disk | FTP | other *** search
- /* idrp_sock.c
- *
- * routines to handle
- * 4 types of sockets used by IDRP
- *
- * idrp_ip_raw_sock_recv(pdu)
- * idrp_clnp_sock_recv(pdu)
- * idrp_idrp_sock_recv(pdu)
- * idrp_udp_sock_recv(pdu)
- * idrp_send_clnp_pdu(peer,p_buf,len,whereto)
- * idrp_send_idrp_pdu(peer,p_buf,len,whereto)
- *
- */
-
- #include "include.h"
- #include "idrp.h"
- #include "inet.h"
- #include <netiso/iso.h>
- #include <netiso/tp_user.h>
-
-
- /*
- * Socket initialization routine for IP PIDs
- */
-
- idrpPeer *
- idrp_ip_raw_sock_recv(pdu_proto)
- idrp_proto_header *pdu_proto;
- {
- idrp_fixed_ip_header *p_ip;
- idrpPeer *peer;
-
-
- p_ip = (idrp_fixed_ip_header *) &pdu_proto->hdr.ip;
-
- /* is it really destined for me or is there some mistake
- * - I think we can take out this check
- * - unless we are binding the IDRP to a OSPF
- * - camp
- */
-
- if (bcmp((caddr_t) &p_ip->hdr.ip_dst,(caddr_t) &idrp_this_node.gw.gw_addr->in.sin_addr,sizeof(struct in_addr)))
- {
- tracef("IDRP IP PDU with bad destination %x",p_ip->hdr.ip_dst);
- trace(TR_IDRP, 0, " from %x",p_ip->hdr.ip_src);
- return ((idrpPeer *) 0);
- }
-
- IDRP_LIST(peer)
- {
- if (!bcmp(&p_ip->hdr.ip_src,&peer->gw.gw_addr->in.sin_addr,sizeof(struct in_addr)))
- {
- /* match on IP address - we've got a peer - return peer */
-
- return (peer);
- }
-
- } IDRP_LIST_END;
-
- trace(TR_IDRP,0,"IDRP PID with unconfigured neighbor from %x",p_ip->hdr.ip_src);
-
- return ((idrpPeer *) 0);
- }
-
- idrpPeer *
- idrp_udp_sock_recv(pdu_proto)
- idrp_proto_header *pdu_proto;
- {
- idrpPeer *peer;
- idrp_fixed_udp_header *p_udp;
-
- p_udp = (idrp_fixed_udp_header *) &pdu_proto->hdr.udp;
-
- /* validate the ISO destination in UDP wrapper */
-
- if (isoaddr_netiso_cmp(&p_udp->hdr.dest, &rt_net))
- {
- tracef("IDRP PDU with bad destination %A", sockbuild_iso((byte *) &p_udp->hdr.dest.isoa_genaddr,
- p_udp->hdr.dest.isoa_len));
- trace(TR_IDRP, 0, " from %A", sockbuild_iso((byte *) &p_udp->hdr.src.isoa_genaddr,
- p_udp->hdr.src.isoa_len));
- }
-
- IDRP_LIST(peer)
- {
- if (!isoaddr_netiso_cmp(&p_udp->hdr.src, &peer->neighbor))
- return (peer);
- break;
- } IDRP_LIST_END;
-
- tracef("IDRP PDU with good destination %A", sockbuild_iso((byte *) p_udp->hdr.dest.isoa_genaddr,
- p_udp->hdr.dest.isoa_len));
- trace(TR_IDRP, 0, " no-configured source: %A", sockbuild_iso((byte *) p_udp->hdr.src.isoa_genaddr,
- p_udp->hdr.src.isoa_len));
-
- return ((idrpPeer *) 0);
- }
-
-
- idrpPeer *
- idrp_clnp_sock_recv(pdu_proto)
- idrp_proto_header *pdu_proto;
- {
- idrpPeer *peer;
- idrp_fixed_clnp_header *p_clnp;
-
- /* Is this pdu destinated for me ? */
-
- p_clnp = (idrp_fixed_clnp_header *) &pdu_proto->hdr.clnp;
-
- /* validate the ISO destination in UDP wrapper */
-
- if (isoaddr_netiso_cmp(&p_clnp->dest, &rt_net))
- {
- tracef("IDRP PDU with bad destination %A", sockbuild_iso((byte *) &p_clnp->dest.isoa_genaddr, \
- p_clnp->dest.isoa_len));
- trace(TR_IDRP, 0," from %A", sockbuild_iso((byte *) &p_clnp->src.isoa_genaddr,p_clnp->src.isoa_len));
- }
-
-
- IDRP_LIST(peer)
- {
- if (!isoaddr_netiso_cmp(&p_clnp->src, &peer->neighbor))
- {
- /* a match - so we have a peer
- * - set length of iso addresses
- * in length
- * return peer pointer
- */
- return (peer);
- break;
- }
- } IDRP_LIST_END;
-
-
- /* trace invalid pdu on this socket */
-
- trace (TR_IDRP, 0, "IDRP PDU arrived from unconfigured neighbor %A", \
- sockbuild_iso((byte *) p_clnp->src.isoa_genaddr, p_clnp->src.isoa_len));
-
-
- }
-
- idrpPeer *
- idrp_idrp_sock_recv(pdu_proto)
- idrp_proto_header *pdu_proto;
- {
- idrpPeer *peer;
- idrp_fixed_idrp_header *p_idrp;
-
- /* Is this pdu destinated for me ? */
-
- p_idrp = (idrp_fixed_idrp_header *) &pdu_proto->hdr.idrp;
-
- /* validate the ISO destination in socket call */
-
- if (isoaddr_netiso_cmp(&p_idrp->idrp_header.dest, &rt_net))
- {
- tracef("IDRP PDU with bad destination %A", sockbuild_iso((byte *) p_idrp->idrp_header.dest.isoa_genaddr, \
- p_idrp->idrp_header.dest.isoa_len));
- trace(TR_IDRP, 0, " from %A", sockbuild_iso((byte *) p_idrp->idrp_header.src.isoa_genaddr, \
- p_idrp->idrp_header.src.isoa_len));
- }
-
-
- IDRP_LIST(peer)
- {
- if (!isoaddr_netiso_cmp(&p_idrp->idrp_header.src, &peer->neighbor))
- {
- break;
- }
- } IDRP_LIST_END;
-
- /* trace invalid pdu on this socket */
-
- trace (TR_IDRP, 0, "IDRP PDU arrived from unconfigured neighbor %A", \
- sockbuild_iso((byte *) p_idrp->idrp_header.src.isoa_genaddr, p_idrp->idrp_header.src.isoa_len));
-
- }
-
- void
- idrp_send_clnp_pdu(peer,p_buf,len,where_to)
- idrpPeer *peer;
- u_char *p_buf;
- int len;
- sockaddr_un *where_to;
- {
- int i;
- struct sockaddr_iso *p_iso_whereto;
-
- /* Turn this into sockadd_iso....
- * It goes to the clnp_output via sendto
- * com/sys/upic
- */
-
- p_iso_whereto = (struct sockaddr_iso *) task_mem_malloc(peer->task,sizeof(struct sockaddr_iso));
- bzero(p_iso_whereto,sizeof(struct sockaddr_iso));
- p_iso_whereto->siso_family = where_to->iso.siso_family;
- /* setting the sockaddr_iso length to
- * the length plus the psel, ssel, tsel
- *
- */
-
- /* hard code for now - plus 5 bytes of header minus one bytes to make net */
- p_iso_whereto->siso_len = where_to->iso.siso_len + 6 ;
- /* take off family and length */
-
- p_iso_whereto->siso_addr.isoa_len = where_to->iso.siso_len;
-
- bcopy(&where_to->iso.siso_addr,&p_iso_whereto->siso_addr.isoa_genaddr,where_to->iso.siso_len);
- i = sendto(peer->task->task_socket,p_buf,len,0,p_iso_whereto,sizeof(struct sockaddr_iso));
-
- if (i < 0 || i != len)
- {
- if (i < 0)
- {
- trace (TR_IDRP,LOG_ERR, "IDRP cannot send CLNP buffer to peer %s errno %d",peer->name,errno);
- return;
- }
- }
- return;
- }
-
-
-
- void idrp_send_idrp_pdu(peer,p_buf,len,whereto)
- idrpPeer *peer;
- u_char *p_buf;
- int len;
- sockaddr_un *whereto;
- {
- int i;
-
- i = sendto(peer->task->task_socket,p_buf,len,0,whereto,sizeof(whereto));
- if (i < 0 || i != len)
- {
- if (i < 0)
- {
- trace (TR_IDRP,LOG_ERR, "IDRP cannot send IDRP PDU via IDRPsocket to peer %s, peer->name");
- }
- }
- }
-
-
- int
- proto_offset(p_pdu,pdu_proto,proto_sock)
- idrpPdu **p_pdu;
- idrp_proto_header *pdu_proto;
- int proto_sock;
- {
- idrpPeer *peer;
- int header_len;
-
- switch (proto_sock)
- {
- case IDRP_PDU_PROTO_IP_RAW:
- /* no header needed for protocol for IP send */
- *p_pdu = (idrpPdu *) pdu_proto;
- header_len = 0;
- break;
-
- case IDRP_PDU_PROTO_UDP:
- /* UDP always has ISO addresses */
-
- *p_pdu = (idrpPdu *) &pdu_proto->hdr.udp.pdu;
- header_len = IDRP_UDP_HEADER_LEN;
- break;
-
- case IDRP_PDU_PROTO_CLNP:
- /* CLNP has just pdu - I hope */
-
- *p_pdu = (idrpPdu *) pdu_proto;
- header_len = 0;
- break;
-
- case IDRP_PDU_PROTO_IDRP:
- /* IDRP has just pdu - I hope */
-
- *p_pdu = (idrpPdu *) pdu_proto;
- header_len = 0;
- break;
- }
- return (header_len);
- }
-
- int send_next_hop(p_atts,peer)
- idrp_attribute_record *p_atts;
- idrpPeer *peer;
- {
- if (!p_atts->next_hop)
- {
- return(FALSE);
- }
-
- /* if the don't send the next hop set from this
- * pdu, then don't send the pdu byte
- */
-
- if (p_atts->local_mask & IDRP_DONT_SEND_NEXT_HOP)
- {
- return (FALSE);
- }
-
- switch (idrp_this_node.proto_sock)
- {
- case IDRP_PDU_PROTO_UDP:
- case IDRP_PDU_PROTO_IP_RAW:
- if (sockaddrcmp(p_atts->next_hop,peer->gw.gw_addr))
- {
- p_atts->attrib[IDRP_ATTR_NEXT_HOP].present = FALSE;
- return(TRUE);
- }
- break;
-
- case IDRP_PDU_PROTO_CLNP:
- case IDRP_PDU_PROTO_IDRP:
- if (sockaddrcmp(p_atts->next_hop,peer->iso_gw.gw_addr));
- {
- p_atts->attrib[IDRP_ATTR_NEXT_HOP].present = FALSE;
- return(TRUE);
- }
- break;
- }
- return(FALSE);
- }
-