root/lib/libsa/rarp.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. rarp_getipaddress
  2. rarpsend
  3. rarprecv

    1 /*      $OpenBSD: rarp.c,v 1.10 2003/08/11 06:23:09 deraadt Exp $       */
    2 /*      $NetBSD: rarp.c,v 1.13 1996/10/13 02:29:05 christos Exp $       */
    3 
    4 /*
    5  * Copyright (c) 1992 Regents of the University of California.
    6  * All rights reserved.
    7  *
    8  * This software was developed by the Computer Systems Engineering group
    9  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
   10  * contributed to Berkeley.
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright
   16  *    notice, this list of conditions and the following disclaimer.
   17  * 2. Redistributions in binary form must reproduce the above copyright
   18  *    notice, this list of conditions and the following disclaimer in the
   19  *    documentation and/or other materials provided with the distribution.
   20  * 3. All advertising materials mentioning features or use of this software
   21  *    must display the following acknowledgement:
   22  *      This product includes software developed by the University of
   23  *      California, Lawrence Berkeley Laboratory and its contributors.
   24  * 4. Neither the name of the University nor the names of its contributors
   25  *    may be used to endorse or promote products derived from this software
   26  *    without specific prior written permission.
   27  *
   28  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   38  * SUCH DAMAGE.
   39  *
   40  * @(#) Header: arp.c,v 1.5 93/07/15 05:52:26 leres Exp  (LBL)
   41  */
   42 #include <sys/param.h>
   43 #include <sys/socket.h>
   44 #include <net/if.h>
   45 #include <netinet/in.h>
   46 
   47 #include <netinet/if_ether.h>
   48 #include <netinet/in_systm.h>
   49 
   50 #include "stand.h"
   51 #include "net.h"
   52 #include "netif.h"
   53 
   54 static ssize_t rarpsend(struct iodesc *, void *, size_t);
   55 static ssize_t rarprecv(struct iodesc *, void *, size_t, time_t);
   56 
   57 /*
   58  * Ethernet (Reverse) Address Resolution Protocol (see RFC 903, and 826).
   59  */
   60 int
   61 rarp_getipaddress(int sock)
   62 {
   63         struct iodesc *d;
   64         struct ether_arp *ap;
   65         struct {
   66                 u_char header[ETHER_SIZE];
   67                 struct {
   68                         struct ether_arp arp;
   69                         u_char pad[18];         /* 60 - sizeof(arp) */
   70                 } data;
   71         } wbuf;
   72         struct {
   73                 u_char header[ETHER_SIZE];
   74                 struct {
   75                         struct ether_arp arp;
   76                         u_char pad[24];         /* extra space */
   77                 } data;
   78         } rbuf;
   79 
   80 #ifdef RARP_DEBUG
   81         if (debug)
   82                 printf("rarp: socket=%d\n", sock);
   83 #endif
   84         if (!(d = socktodesc(sock))) {
   85                 printf("rarp: bad socket. %d\n", sock);
   86                 return (-1);
   87         }
   88 #ifdef RARP_DEBUG
   89         if (debug)
   90                 printf("rarp: d=%x\n", (u_int)d);
   91 #endif
   92 
   93         bzero((char *)&wbuf.data, sizeof(wbuf.data));
   94         ap = &wbuf.data.arp;
   95         ap->arp_hrd = htons(ARPHRD_ETHER);
   96         ap->arp_pro = htons(ETHERTYPE_IP);
   97         ap->arp_hln = sizeof(ap->arp_sha); /* hardware address length */
   98         ap->arp_pln = sizeof(ap->arp_spa); /* protocol address length */
   99         ap->arp_op = htons(ARPOP_REVREQUEST);
  100         bcopy(d->myea, ap->arp_sha, 6);
  101         bcopy(d->myea, ap->arp_tha, 6);
  102 
  103         if (sendrecv(d,
  104             rarpsend, &wbuf.data, sizeof(wbuf.data),
  105             rarprecv, &rbuf.data, sizeof(rbuf.data)) < 0)
  106         {
  107                 printf("No response for RARP request\n");
  108                 return (-1);
  109         }
  110 
  111         ap = &rbuf.data.arp;
  112         bcopy(ap->arp_tpa, (char *)&myip, sizeof(myip));
  113 #if 0
  114         /* XXX - Can NOT assume this is our root server! */
  115         bcopy(ap->arp_spa, (char *)&rootip, sizeof(rootip));
  116 #endif
  117 
  118         /* Compute our "natural" netmask. */
  119         if (IN_CLASSA(myip.s_addr))
  120                 netmask = IN_CLASSA_NET;
  121         else if (IN_CLASSB(myip.s_addr))
  122                 netmask = IN_CLASSB_NET;
  123         else
  124                 netmask = IN_CLASSC_NET;
  125 
  126         d->myip = myip;
  127         return (0);
  128 }
  129 
  130 /*
  131  * Broadcast a RARP request (i.e. who knows who I am)
  132  */
  133 static ssize_t
  134 rarpsend(struct iodesc *d, void *pkt, size_t len)
  135 {
  136 
  137 #ifdef RARP_DEBUG
  138         if (debug)
  139                 printf("rarpsend: called\n");
  140 #endif
  141 
  142         return (sendether(d, pkt, len, bcea, ETHERTYPE_REVARP));
  143 }
  144 
  145 /*
  146  * Returns 0 if this is the packet we're waiting for
  147  * else -1 (and errno == 0)
  148  */
  149 static ssize_t
  150 rarprecv(struct iodesc *d, void *pkt, size_t len, time_t tleft)
  151 {
  152         ssize_t n;
  153         struct ether_arp *ap;
  154         u_int16_t etype;        /* host order */
  155 
  156 #ifdef RARP_DEBUG
  157         if (debug)
  158                 printf("rarprecv: ");
  159 #endif
  160 
  161         n = readether(d, pkt, len, tleft, &etype);
  162         errno = 0;      /* XXX */
  163         if (n < 0 || (size_t)n < sizeof(struct ether_arp)) {
  164 #ifdef RARP_DEBUG
  165                 if (debug)
  166                         printf("bad len=%d\n", n);
  167 #endif
  168                 return (-1);
  169         }
  170 
  171         if (etype != ETHERTYPE_REVARP) {
  172 #ifdef RARP_DEBUG
  173                 if (debug)
  174                         printf("bad type=0x%x\n", etype);
  175 #endif
  176                 return (-1);
  177         }
  178 
  179         ap = (struct ether_arp *)pkt;
  180         if (ap->arp_hrd != htons(ARPHRD_ETHER) ||
  181             ap->arp_pro != htons(ETHERTYPE_IP) ||
  182             ap->arp_hln != sizeof(ap->arp_sha) ||
  183             ap->arp_pln != sizeof(ap->arp_spa) )
  184         {
  185 #ifdef RARP_DEBUG
  186                 if (debug)
  187                         printf("bad hrd/pro/hln/pln\n");
  188 #endif
  189                 return (-1);
  190         }
  191 
  192         if (ap->arp_op != htons(ARPOP_REVREPLY)) {
  193 #ifdef RARP_DEBUG
  194                 if (debug)
  195                         printf("bad op=0x%x\n", ntohs(ap->arp_op));
  196 #endif
  197                 return (-1);
  198         }
  199 
  200         /* Is the reply for our Ethernet address? */
  201         if (bcmp(ap->arp_tha, d->myea, 6)) {
  202 #ifdef RARP_DEBUG
  203                 if (debug)
  204                         printf("unwanted address\n");
  205 #endif
  206                 return (-1);
  207         }
  208 
  209         /* We have our answer. */
  210 #ifdef RARP_DEBUG
  211         if (debug)
  212                 printf("got it\n");
  213 #endif
  214         return (n);
  215 }

/* [<][>][^][v][top][bottom][index][help] */