dhcpr.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* dhcpr.c - DHCP relay agent library */
  2. /* Copyright 1984 - 2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01h,23apr02,wap  Use BPF_WORDALIGN() when retreiving multiple messages from a
  8.                  BPF buffer (SPR #74215)
  9. 01g,03dec01,vvv  fixed packet forwarding (SPR #71645)
  10. 01f,16feb01,rae  fixed modhist line
  11. 01e,14jun00,spm  upgraded to RFC 2131 and removed direct link-level access
  12. 01d,06oct97,spm  removed reference to deleted endDriver global; replaced with
  13.                  support for dynamic driver type detection
  14. 01c,06may97,spm  changed memory access to align IP header on four byte boundary
  15. 01b,28apr97,spm  allowed user to change DHCP_MAX_HOPS setting
  16. 01a,07apr97,spm  created by modifying WIDE project DHCP implementation
  17. */
  18. /*
  19. DESCRIPTION
  20. This library implements the relay agent of the Dynamic Host Configuration 
  21. Protocol. It will transfer all DHCP or BOOTP messages arriving on the
  22. client port of the specified network interfaces across subnet boundaries to
  23. the IP addresses of other DHCP relay agents or DHCP servers.
  24. INCLUDE_FILES: dhcprLib.h
  25. */
  26. /*
  27.  * WIDE Project DHCP Implementation
  28.  * Copyright (c) 1995 Akihiro Tominaga
  29.  * Copyright (c) 1995 WIDE Project
  30.  * All rights reserved.
  31.  *
  32.  * Permission to use, copy, modify and distribute this software and its
  33.  * documentation is hereby granted, provided only with the following
  34.  * conditions are satisfied:
  35.  *
  36.  * 1. Both the copyright notice and this permission notice appear in
  37.  *    all copies of the software, derivative works or modified versions,
  38.  *    and any portions thereof, and that both notices appear in
  39.  *    supporting documentation.
  40.  * 2. All advertising materials mentioning features or use of this software
  41.  *    must display the following acknowledgement:
  42.  *      This product includes software developed by WIDE Project and
  43.  *      its contributors.
  44.  * 3. Neither the name of WIDE Project nor the names of its contributors
  45.  *    may be used to endorse or promote products derived from this software
  46.  *    without specific prior written permission.
  47.  *
  48.  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND WIDE
  49.  * PROJECT DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  50.  * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ALSO, THERE
  51.  * IS NO WARRANTY IMPLIED OR OTHERWISE, NOR IS SUPPORT PROVIDED.
  52.  *
  53.  * Feedback of the results generated from any improvements or
  54.  * extensions made to this software would be much appreciated.
  55.  * Any such feedback should be sent to:
  56.  * 
  57.  *  Akihiro Tominaga
  58.  *  WIDE Project
  59.  *  Keio University, Endo 5322, Kanagawa, Japan
  60.  *  (E-mail: dhcp-dist@wide.ad.jp)
  61.  *
  62.  * WIDE project has the rights to redistribute these changes.
  63.  */
  64. /* includes */
  65. #include <stdio.h>
  66. #include <stdlib.h>
  67. #include <sys/ioctl.h>
  68. #include <netinet/in.h>
  69. #include <arpa/inet.h>
  70. #include "net/bpf.h"
  71. #include "logLib.h"
  72. #include "sockLib.h"
  73. #include "ioLib.h"
  74. #include "muxLib.h"
  75. #include "dhcprLib.h"
  76. #include "dhcp/dhcp.h"
  77. #include "dhcp/common.h"
  78. #include "dhcp/common_subr.h"
  79. /* globals */
  80. IMPORT BOOL dhcprInputHook (struct ifnet*, char*, int);
  81. struct msg dhcprMsgIn;
  82. IMPORT struct if_info *dhcprIntfaceList;
  83. IMPORT int dhcprBufSize;    /* size of receive buffer for each interface. */
  84. IMPORT char * pDhcprSendBuf;
  85. /* forward declarations */
  86. void dhcpServerRelay (struct if_info *);
  87. IMPORT void dhcpClientRelay (struct if_info *, int, char *);
  88. /*******************************************************************************
  89. *
  90. * dhcprStart - monitor specified network interfaces
  91. *
  92. * This routine monitors the interfaces specified by the user for incoming
  93. * DHCP or BOOTP messages. It is the entry point for the relay agent task and 
  94. * should only be called internally.
  95. *
  96. * RETURNS: N/A
  97. *
  98. * ERRNO: N/A
  99. *
  100. * NOMANUAL
  101. */
  102. void dhcprStart (void)
  103.     {
  104.     struct if_info *ifp = NULL;          /* pointer to interface */
  105.     struct if_info *pIf = NULL;          
  106.     int n = 0;
  107.     struct bpf_hdr *  pMsgHdr;
  108.     char *  pMsgData;
  109.     int  msglen;
  110.     int  curlen;
  111.     int  totlen;         /* Amount of data in BPF buffer. */
  112.   /****************************
  113.    * Main loop                *
  114.    * Process incoming message *
  115.    ****************************/
  116.   
  117.     FOREVER
  118.         {
  119.         /* select and read from interfaces */
  120.         ifp = read_interfaces (dhcprIntfaceList, &n, dhcprBufSize);
  121.         if (ifp == NULL)
  122.             continue;
  123.         /* Divide each DHCP message in buffer into protocol sections. */
  124.         msglen = curlen = 0;
  125.         totlen = n;
  126.         pMsgHdr = (struct bpf_hdr *)ifp->buf;
  127.         pMsgData = ifp->buf;
  128.         while (curlen < totlen)
  129.             {
  130.             msglen = BPF_WORDALIGN(pMsgHdr->bh_hdrlen + pMsgHdr->bh_caplen);
  131.             curlen += msglen;
  132.             /* Set the IP pointer to skip the BPF and link level headers. */
  133.             dhcprMsgIn.ip = (struct ip *) (pMsgData + pMsgHdr->bh_hdrlen +
  134.                                            pMsgHdr->bh_linklen);
  135.             /* Check if message is addressed to us */
  136.             pIf = dhcprIntfaceList;
  137.     while (pIf != NULL)
  138. {
  139. if (pIf->ipaddr.s_addr == dhcprMsgIn.ip->ip_dst.s_addr)
  140.     break;
  141. pIf = pIf->next;
  142. }
  143.             if ((dhcprMsgIn.ip->ip_dst.s_addr == 0xffffffff || (pIf != NULL)) &&
  144.                   check_ipsum (dhcprMsgIn.ip))
  145.                 dhcprMsgIn.udp = (struct udphdr *) ((char *) dhcprMsgIn.ip + 
  146.     (dhcprMsgIn.ip->ip_hl << 2));
  147.             else
  148.                 {
  149.                 pMsgData = pMsgData + msglen;
  150.                 pMsgHdr = (struct bpf_hdr *)pMsgData;
  151.                 continue;
  152.                 }
  153.             if (check_udpsum (dhcprMsgIn.ip, dhcprMsgIn.udp))
  154.                 dhcprMsgIn.dhcp = (struct dhcp *) ((char *) dhcprMsgIn.udp +
  155.     UDPHL);
  156.             else
  157.                 {
  158.                 pMsgData = pMsgData + msglen;
  159.                 pMsgHdr = (struct bpf_hdr *)pMsgData;
  160.                 continue;
  161.                 }
  162.             dhcpMsgIn.ip = dhcprMsgIn.ip;
  163.             dhcpMsgIn.udp = dhcprMsgIn.udp;
  164.             dhcpMsgIn.dhcp = dhcprMsgIn.dhcp;
  165.             if (dhcpMsgIn.dhcp->op == BOOTREQUEST)
  166.                 dhcpServerRelay (ifp);     /* process the packet */
  167.             else if (dhcpMsgIn.dhcp->op == BOOTREPLY)
  168.                 dhcpClientRelay (dhcprIntfaceList, DHCPLEN (dhcprMsgIn.udp),
  169.                                  pDhcprSendBuf);
  170.             pMsgData = pMsgData + msglen;
  171.             pMsgHdr = (struct bpf_hdr *)pMsgData;
  172.             }
  173.         }
  174.     }