The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/servers/inet/inet.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      this file contains the interface of the network software with rest of
    2         minix. Furthermore it contains the main loop of the network task.
    3 
    4 Copyright 1995 Philip Homburg
    5 
    6 The valid messages and their parameters are:
    7 
    8 from FS:
    9  __________________________________________________________________
   10 |               |           |         |       |          |         |
   11 | m_type        |   DEVICE  | PROC_NR | COUNT | POSITION | ADDRESS |
   12 |_______________|___________|_________|_______|__________|_________|
   13 |               |           |         |       |          |         |
   14 | NW_OPEN       | minor dev | proc nr | mode  |          |         |
   15 |_______________|___________|_________|_______|__________|_________|
   16 |               |           |         |       |          |         |
   17 | NW_CLOSE      | minor dev | proc nr |       |          |         |
   18 |_______________|___________|_________|_______|__________|_________|
   19 |               |           |         |       |          |         |
   20 | NW_IOCTL      | minor dev | proc nr |       | NWIO..   | address |
   21 |_______________|___________|_________|_______|__________|_________|
   22 |               |           |         |       |          |         |
   23 | NW_READ       | minor dev | proc nr | count |          | address |
   24 |_______________|___________|_________|_______|__________|_________|
   25 |               |           |         |       |          |         |
   26 | NW_WRITE      | minor dev | proc nr | count |          | address |
   27 |_______________|___________|_________|_______|__________|_________|
   28 |               |           |         |       |          |         |
   29 | NW_CANCEL     | minor dev | proc nr |       |          |         |
   30 |_______________|___________|_________|_______|__________|_________|
   31 
   32 from DL_ETH:
   33  _______________________________________________________________________
   34 |               |           |         |          |            |         |
   35 | m_type        |  DL_PORT  | DL_PROC | DL_COUNT |  DL_STAT   | DL_TIME |
   36 |_______________|___________|_________|__________|____________|_________|
   37 |               |           |         |          |            |         |
   38 | DL_INIT_REPLY | minor dev | proc nr | rd_count |  0  | stat |  time   |
   39 |_______________|___________|_________|__________|____________|_________|
   40 |               |           |         |          |            |         |
   41 | DL_TASK_REPLY | minor dev | proc nr | rd_count | err | stat |  time   |
   42 |_______________|___________|_________|__________|____________|_________|
   43 */
   44 
   45 #include "inet.h"
   46 
   47 #define _MINIX_SOURCE 1
   48 
   49 #include <fcntl.h>
   50 #include <time.h>
   51 #include <unistd.h>
   52 #include <sys/svrctl.h>
   53 
   54 #include "mq.h"
   55 #include "qp.h"
   56 #include "proto.h"
   57 #include "generic/type.h"
   58 
   59 #include "generic/arp.h"
   60 #include "generic/assert.h"
   61 #include "generic/buf.h"
   62 #include "generic/clock.h"
   63 #include "generic/eth.h"
   64 #include "generic/event.h"
   65 #include "generic/ip.h"
   66 #include "generic/psip.h"
   67 #include "generic/rand256.h"
   68 #include "generic/sr.h"
   69 #include "generic/tcp.h"
   70 #include "generic/udp.h"
   71 
   72 THIS_FILE
   73 
   74 #define RANDOM_DEV_NAME "/dev/random"
   75 
   76 int this_proc;          /* Process number of this server. */
   77 
   78 #ifdef __minix_vmd
   79 static int synal_tasknr= ANY;
   80 #endif
   81 
   82 /* Killing Solaris */
   83 int killer_inet= 0;
   84 
   85 #ifdef BUF_CONSISTENCY_CHECK
   86 extern int inet_buf_debug;
   87 #endif
   88 
   89 _PROTOTYPE( void main, (void) );
   90 
   91 FORWARD _PROTOTYPE( void nw_conf, (void) );
   92 FORWARD _PROTOTYPE( void nw_init, (void) );
   93 
   94 PUBLIC void main()
   95 {
   96         mq_t *mq;
   97         int r;
   98         int source, timerand, fd;
   99         struct fssignon device;
  100 #ifdef __minix_vmd
  101         struct systaskinfo info;
  102 #endif
  103         u8_t randbits[32];
  104         struct timeval tv;
  105 
  106 #if DEBUG
  107         printf("Starting inet...\n");
  108         printf("%s\n", version);
  109 #endif
  110 
  111         /* Read configuration. */
  112         nw_conf();
  113 
  114         /* Get a random number */
  115         timerand= 1;
  116         fd= open(RANDOM_DEV_NAME, O_RDONLY | O_NONBLOCK);
  117         if (fd != -1)
  118         {
  119                 r= read(fd, randbits, sizeof(randbits));
  120                 if (r == sizeof(randbits))
  121                         timerand= 0;
  122                 else
  123                 {
  124                         printf("unable to read random data from %s: %s\n",
  125                                 RANDOM_DEV_NAME, r == -1 ? strerror(errno) :
  126                                 r == 0 ? "EOF" : "not enough data");
  127                 }
  128                 close(fd);
  129         }
  130         else
  131         {
  132                 printf("unable to open random device %s: %s\n",
  133                         RANDOM_DEV_NAME, strerror(errno));
  134         }
  135         if (timerand)
  136         {
  137                 printf("using current time for random-number seed\n");
  138 #ifdef __minix_vmd
  139                 r= sysutime(UTIME_TIMEOFDAY, &tv);
  140 #else /* Minix 3 */
  141                 r= gettimeofday(&tv, NULL);
  142 #endif
  143                 if (r == -1)
  144                 {
  145                         printf("sysutime failed: %s\n", strerror(errno));
  146                         exit(1);
  147                 }
  148                 memcpy(randbits, &tv, sizeof(tv));
  149         }
  150         init_rand256(randbits);
  151 
  152 #ifdef __minix_vmd
  153         if (svrctl(SYSSIGNON, (void *) &info) == -1) pause();
  154 
  155         /* Our new identity as a server. */
  156         this_proc = info.proc_nr;
  157 #else /* Minix 3 */
  158 
  159         /* Our new identity as a server. */
  160         if ((this_proc = getprocnr()) < 0)
  161                 ip_panic(( "unable to get own process nr\n"));
  162 #endif
  163 
  164         /* Register the device group. */
  165         device.dev= ip_dev;
  166         device.style= STYLE_CLONE;
  167         if (svrctl(FSSIGNON, (void *) &device) == -1) {
  168                 printf("inet: error %d on registering ethernet devices\n",
  169                         errno);
  170                 pause();
  171         }
  172 
  173 #ifdef BUF_CONSISTENCY_CHECK
  174         inet_buf_debug= (getenv("inetbufdebug") && 
  175                 (strcmp(getenv("inetbufdebug"), "on") == 0));
  176         inet_buf_debug= 100;
  177         if (inet_buf_debug)
  178         {
  179                 ip_warning(( "buffer consistency check enabled" ));
  180         }
  181 #endif
  182 
  183         if (getenv("killerinet"))
  184         {
  185                 ip_warning(( "killer inet active" ));
  186                 killer_inet= 1;
  187         }
  188 
  189 #ifdef __minix_vmd
  190         r= sys_findproc(SYN_AL_NAME, &synal_tasknr, 0);
  191         if (r != OK)
  192                 ip_panic(( "unable to find synchronous alarm task: %d\n", r ));
  193 #endif
  194 
  195         nw_init();
  196         while (TRUE)
  197         {
  198 #ifdef BUF_CONSISTENCY_CHECK
  199                 if (inet_buf_debug)
  200                 {
  201                         static int buf_debug_count= 0;
  202 
  203                         if (++buf_debug_count >= inet_buf_debug)
  204                         {
  205                                 buf_debug_count= 0;
  206                                 if (!bf_consistency_check())
  207                                         break;
  208                         }
  209                 }
  210 #endif
  211                 if (ev_head)
  212                 {
  213                         ev_process();
  214                         continue;
  215                 }
  216                 if (clck_call_expire)
  217                 {
  218                         clck_expire_timers();
  219                         continue;
  220                 }
  221                 mq= mq_get();
  222                 if (!mq)
  223                         ip_panic(("out of messages"));
  224 
  225                 r= receive (ANY, &mq->mq_mess);
  226                 if (r<0)
  227                 {
  228                         ip_panic(("unable to receive: %d", r));
  229                 }
  230                 reset_time();
  231                 source= mq->mq_mess.m_source;
  232                 if (source == FS_PROC_NR)
  233                 {
  234                         sr_rec(mq);
  235                 }
  236 #ifdef __minix_vmd
  237                 else if (source == synal_tasknr)
  238                 {
  239                         clck_tick (&mq->mq_mess);
  240                         mq_free(mq);
  241                 }
  242 #else /* Minix 3 */
  243                 else if (mq->mq_mess.m_type == SYN_ALARM)
  244                 {
  245                         clck_tick(&mq->mq_mess);
  246                         mq_free(mq);
  247                 } 
  248                 else if (mq->mq_mess.m_type == SYS_SIG)
  249                 {
  250                         /* signaled */ 
  251                         /* probably SIGTERM */
  252                         mq_free(mq);
  253                 } 
  254                 else if (mq->mq_mess.m_type & NOTIFY_MESSAGE)
  255                 {
  256                         /* A driver is (re)started. */
  257                         eth_check_drivers(&mq->mq_mess);
  258                         mq_free(mq);
  259                 }
  260 #endif
  261                 else
  262                 {
  263 compare(mq->mq_mess.m_type, ==, DL_TASK_REPLY);
  264                         eth_rec(&mq->mq_mess);
  265                         mq_free(mq);
  266                 }
  267         }
  268         ip_panic(("task is not allowed to terminate"));
  269 }
  270 
  271 PRIVATE void nw_conf()
  272 {
  273         read_conf();
  274         eth_prep();
  275         arp_prep();
  276         psip_prep();
  277         ip_prep();
  278         tcp_prep();
  279         udp_prep();
  280 }
  281 
  282 PRIVATE void nw_init()
  283 {
  284         mq_init();
  285         qp_init();
  286         bf_init();
  287         clck_init();
  288         sr_init();
  289         eth_init();
  290         arp_init();
  291         psip_init();
  292         ip_init();
  293         tcp_init();
  294         udp_init();
  295 }
  296 
  297 PUBLIC void panic0(file, line)
  298 char *file;
  299 int line;
  300 {
  301         printf("panic at %s, %d: ", file, line);
  302 }
  303 
  304 PUBLIC void inet_panic()
  305 {
  306         printf("\ninet stacktrace: ");
  307         stacktrace();
  308 #ifdef __minix_vmd
  309         sys_abort(RBT_PANIC);
  310 #else /* Minix 3 */
  311         (panic)("INET","aborted due to a panic",NO_NUM);
  312 #endif
  313         for(;;);
  314 }
  315 
  316 #if !NDEBUG
  317 PUBLIC void bad_assertion(file, line, what)
  318 char *file;
  319 int line;
  320 char *what;
  321 {
  322         panic0(file, line);
  323         printf("assertion \"%s\" failed", what);
  324         panic();
  325 }
  326 
  327 
  328 PUBLIC void bad_compare(file, line, lhs, what, rhs)
  329 char *file;
  330 int line;
  331 int lhs;
  332 char *what;
  333 int rhs;
  334 {
  335         panic0(file, line);
  336         printf("compare (%d) %s (%d) failed", lhs, what, rhs);
  337         panic();
  338 }
  339 #endif /* !NDEBUG */
  340 
  341 /*
  342  * $PchId: inet.c,v 1.23 2005/06/28 14:27:22 philip Exp $
  343  */

Cache object: 43ee43a064c09127dfe2e13561433a3e


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.