1: /*
   2:  * Copyright (c) 1983 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #ifndef lint
   8: static char sccsid[] = "@(#)if.c	5.3 (Berkeley) 4/20/86";
   9: #endif not lint
  10: 
  11: /*
  12:  * Routing Table Management Daemon
  13:  */
  14: #include "defs.h"
  15: 
  16: extern  struct interface *ifnet;
  17: 
  18: /*
  19:  * Find the interface with address addr.
  20:  */
  21: struct interface *
  22: if_ifwithaddr(addr)
  23:     struct sockaddr *addr;
  24: {
  25:     register struct interface *ifp;
  26: 
  27: #define same(a1, a2) \
  28:     (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0)
  29:     for (ifp = ifnet; ifp; ifp = ifp->int_next) {
  30:         if (ifp->int_flags & IFF_REMOTE)
  31:             continue;
  32:         if (ifp->int_addr.sa_family != addr->sa_family)
  33:             continue;
  34:         if (same(&ifp->int_addr, addr))
  35:             break;
  36:         if ((ifp->int_flags & IFF_BROADCAST) &&
  37:             same(&ifp->int_broadaddr, addr))
  38:             break;
  39:     }
  40:     return (ifp);
  41: }
  42: 
  43: /*
  44:  * Find the point-to-point interface with destination address addr.
  45:  */
  46: struct interface *
  47: if_ifwithdstaddr(addr)
  48:     struct sockaddr *addr;
  49: {
  50:     register struct interface *ifp;
  51: 
  52:     for (ifp = ifnet; ifp; ifp = ifp->int_next) {
  53:         if ((ifp->int_flags & IFF_POINTOPOINT) == 0)
  54:             continue;
  55:         if (same(&ifp->int_dstaddr, addr))
  56:             break;
  57:     }
  58:     return (ifp);
  59: }
  60: 
  61: /*
  62:  * Find the interface on the network
  63:  * of the specified address.
  64:  */
  65: struct interface *
  66: if_ifwithnet(addr)
  67:     register struct sockaddr *addr;
  68: {
  69:     register struct interface *ifp;
  70:     register int af = addr->sa_family;
  71:     register int (*netmatch)();
  72: 
  73:     if (af >= af_max)
  74:         return (0);
  75:     netmatch = afswitch[af].af_netmatch;
  76:     for (ifp = ifnet; ifp; ifp = ifp->int_next) {
  77:         if (ifp->int_flags & IFF_REMOTE)
  78:             continue;
  79:         if (af != ifp->int_addr.sa_family)
  80:             continue;
  81:         if ((*netmatch)(addr, &ifp->int_addr))
  82:             break;
  83:     }
  84:     return (ifp);
  85: }
  86: 
  87: /*
  88:  * Find an interface from which the specified address
  89:  * should have come from.  Used for figuring out which
  90:  * interface a packet came in on -- for tracing.
  91:  */
  92: struct interface *
  93: if_iflookup(addr)
  94:     struct sockaddr *addr;
  95: {
  96:     register struct interface *ifp, *maybe;
  97:     register int af = addr->sa_family;
  98:     register int (*netmatch)();
  99: 
 100:     if (af >= af_max)
 101:         return (0);
 102:     maybe = 0;
 103:     netmatch = afswitch[af].af_netmatch;
 104:     for (ifp = ifnet; ifp; ifp = ifp->int_next) {
 105:         if (ifp->int_addr.sa_family != af)
 106:             continue;
 107:         if (same(&ifp->int_addr, addr))
 108:             break;
 109:         if ((ifp->int_flags & IFF_BROADCAST) &&
 110:             same(&ifp->int_broadaddr, addr))
 111:             break;
 112:         if ((ifp->int_flags & IFF_POINTOPOINT) &&
 113:             same(&ifp->int_dstaddr, addr))
 114:             break;
 115:         if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr))
 116:             maybe = ifp;
 117:     }
 118:     if (ifp == 0)
 119:         ifp = maybe;
 120:     return (ifp);
 121: }

Defined functions

Defined variables

sccsid defined in line 8; never used

Defined macros

same defined in line 27; used 6 times
Last modified: 1987-07-21
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 3204
Valid CSS Valid XHTML 1.0 Strict