IN_PROTO.C
上传用户:tjbfgc
上传日期:2013-03-31
资源大小:140k
文件大小:5k
源码类别:

网络编程

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 1982, 1986, 1993
  3.  * The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the University of
  16.  * California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#)in_proto.c 8.1 (Berkeley) 6/10/93
  34.  */
  35. #include <sys/param.h>
  36. #include <sys/socket.h>
  37. #include <sys/protosw.h>
  38. #include <sys/domain.h>
  39. #include <sys/mbuf.h>
  40. #include <net/if.h>
  41. #include <net/radix.h>
  42. #include <net/route.h>
  43. #include <netinet/in.h>
  44. #include <netinet/in_systm.h>
  45. #include <netinet/ip.h>
  46. #include <netinet/ip_var.h>
  47. #include <netinet/ip_icmp.h>
  48. #include <netinet/in_pcb.h>
  49. #include <netinet/igmp_var.h>
  50. #include <netinet/tcp.h>
  51. #include <netinet/tcp_fsm.h>
  52. #include <netinet/tcp_seq.h>
  53. #include <netinet/tcp_timer.h>
  54. #include <netinet/tcp_var.h>
  55. #include <netinet/tcpip.h>
  56. #include <netinet/tcp_debug.h>
  57. #include <netinet/udp.h>
  58. #include <netinet/udp_var.h>
  59. /*
  60.  * TCP/IP protocol family: IP, ICMP, UDP, TCP.
  61.  */
  62. #ifdef NSIP
  63. void idpip_input(), nsip_ctlinput();
  64. #endif
  65. #ifdef TPIP
  66. void tpip_input(), tpip_ctlinput(), tp_ctloutput();
  67. int tp_init(), tp_slowtimo(), tp_drain(), tp_usrreq();
  68. #endif
  69. #ifdef EON
  70. void eoninput(), eonctlinput(), eonprotoinit();
  71. #endif /* EON */
  72. extern struct domain inetdomain;
  73. struct protosw inetsw[] = {
  74. { 0, &inetdomain, 0, 0,
  75.   0, ip_output, 0, 0,
  76.   0,
  77.   ip_init, 0, ip_slowtimo, ip_drain, ip_sysctl
  78. },
  79. { SOCK_DGRAM, &inetdomain, IPPROTO_UDP, PR_ATOMIC|PR_ADDR,
  80.   udp_input, 0, udp_ctlinput, ip_ctloutput,
  81.   udp_usrreq,
  82.   udp_init, 0, 0, 0, udp_sysctl
  83. },
  84. { SOCK_STREAM, &inetdomain, IPPROTO_TCP, PR_CONNREQUIRED|PR_WANTRCVD,
  85.   tcp_input, 0, tcp_ctlinput, tcp_ctloutput,
  86.   tcp_usrreq,
  87.   tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain,
  88. },
  89. { SOCK_RAW, &inetdomain, IPPROTO_RAW, PR_ATOMIC|PR_ADDR,
  90.   rip_input, rip_output, 0, rip_ctloutput,
  91.   rip_usrreq,
  92.   0, 0, 0, 0,
  93. },
  94. { SOCK_RAW, &inetdomain, IPPROTO_ICMP, PR_ATOMIC|PR_ADDR,
  95.   icmp_input, rip_output, 0, rip_ctloutput,
  96.   rip_usrreq,
  97.   0, 0, 0, 0, icmp_sysctl
  98. },
  99. { SOCK_RAW, &inetdomain, IPPROTO_IGMP, PR_ATOMIC|PR_ADDR,
  100.   igmp_input, rip_output, 0, rip_ctloutput,
  101.   rip_usrreq,
  102.   igmp_init, igmp_fasttimo, 0, 0,
  103. },
  104. #ifdef TPIP
  105. { SOCK_SEQPACKET,&inetdomain, IPPROTO_TP, PR_CONNREQUIRED|PR_WANTRCVD,
  106.   tpip_input, 0, tpip_ctlinput, tp_ctloutput,
  107.   tp_usrreq,
  108.   tp_init, 0, tp_slowtimo, tp_drain,
  109. },
  110. #endif
  111. /* EON (ISO CLNL over IP) */
  112. #ifdef EON
  113. { SOCK_RAW, &inetdomain, IPPROTO_EON, 0,
  114.   eoninput, 0, eonctlinput, 0,
  115.   0,
  116.   eonprotoinit, 0, 0, 0,
  117. },
  118. #endif
  119. #ifdef NSIP
  120. { SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR,
  121.   idpip_input, rip_output, nsip_ctlinput, 0,
  122.   rip_usrreq,
  123.   0, 0, 0, 0,
  124. },
  125. #endif
  126. /* raw wildcard */
  127. { SOCK_RAW, &inetdomain, 0, PR_ATOMIC|PR_ADDR,
  128.   rip_input, rip_output, 0, rip_ctloutput,
  129.   rip_usrreq,
  130.   rip_init, 0, 0, 0,
  131. },
  132. };
  133. struct domain inetdomain =
  134.     { AF_INET, "internet", 0, 0, 0, 
  135.       inetsw, &inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0,
  136.       rn_inithead, 32, sizeof(struct sockaddr_in) };
  137. #include "imp.h"
  138. #if NIMP > 0
  139. extern struct domain impdomain;
  140. int rimp_output(), hostslowtimo();
  141. struct protosw impsw[] = {
  142. { SOCK_RAW, &impdomain, 0, PR_ATOMIC|PR_ADDR,
  143.   0, rimp_output, 0, 0,
  144.   rip_usrreq,
  145.   0, 0, hostslowtimo, 0,
  146. },
  147. };
  148. struct domain impdomain =
  149.     { AF_IMPLINK, "imp", 0, 0, 0,
  150.       impsw, &impsw[sizeof (impsw)/sizeof(impsw[0])] };
  151. #endif
  152. #include "hy.h"
  153. #if NHY > 0
  154. /*
  155.  * HYPERchannel protocol family: raw interface.
  156.  */
  157. int rhy_output();
  158. extern struct domain hydomain;
  159. struct protosw hysw[] = {
  160. { SOCK_RAW, &hydomain, 0, PR_ATOMIC|PR_ADDR,
  161.   0, rhy_output, 0, 0,
  162.   rip_usrreq,
  163.   0, 0, 0, 0,
  164. },
  165. };
  166. struct domain hydomain =
  167.     { AF_HYLINK, "hy", 0, 0, 0, hysw, &hysw[sizeof (hysw)/sizeof(hysw[0])] };
  168. #endif