Diff for /src/sys/netinet/ip_input.c between versions 1.14 and 1.15

version 1.14, 2004/04/01 23:04:50 version 1.15, 2004/04/03 22:18:30
Line 60 Line 60
 #include <sys/sysctl.h>  #include <sys/sysctl.h>
 #include <sys/in_cksum.h>  #include <sys/in_cksum.h>
   
   #include <sys/thread2.h>
   #include <sys/msgport2.h>
   
 #include <net/if.h>  #include <net/if.h>
 #include <net/if_types.h>  #include <net/if_types.h>
 #include <net/if_var.h>  #include <net/if_var.h>
Line 298  ip_init() Line 301  ip_init()
 struct  route ipforward_rt;  struct  route ipforward_rt;
 static struct   sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };  static struct   sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };
   
   /* Do transport protocol processing. */
   static void
   transport_processing_oncpu(struct mbuf *m, int hlen, struct ip *ip,
                              struct sockaddr_in *nexthop)
   {
           /*
            * Switch out to protocol's input routine.
            */
           if (nexthop && ip->ip_p == IPPROTO_TCP) {
                   /* TCP needs IPFORWARD info if available */
                   struct m_hdr tag;
   
                   tag.mh_type = MT_TAG;
                   tag.mh_flags = PACKET_TAG_IPFORWARD;
                   tag.mh_data = (caddr_t)nexthop;
                   tag.mh_next = m;
   
                   (*inetsw[ip_protox[ip->ip_p]].pr_input)
                       ((struct mbuf *)&tag, hlen, ip->ip_p);
           } else {
                   (*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen, ip->ip_p);
           }
   }
   
   struct netmsg_transport_packet {
           struct lwkt_msg         nm_lmsg;
           netisr_fn_t             nm_handler;
           struct mbuf             *nm_mbuf;
           int                     nm_hlen;
           boolean_t               nm_hasnexthop;
           struct sockaddr_in      nm_nexthop;
   };
   
   static int
   transport_processing_handler(struct netmsg *msg0)
   {
           struct netmsg_transport_packet *msg =
               (struct netmsg_transport_packet *)msg0;
           struct sockaddr_in *nexthop;
           struct ip *ip;
   
           ip = mtod(msg->nm_mbuf, struct ip *);
           nexthop = msg->nm_hasnexthop ? &msg->nm_nexthop : NULL;
           transport_processing_oncpu(msg->nm_mbuf, msg->nm_hlen, ip, nexthop);
   
           return (0);
   }
   
 /*  /*
  * Ip input routine.  Checksum and byte swap header.  If fragmented   * Ip input routine.  Checksum and byte swap header.  If fragmented
  * try to reassemble.  Process options.  Pass to next level.   * try to reassemble.  Process options.  Pass to next level.
Line 316  ip_input(struct netmsg *msg) Line 367  ip_input(struct netmsg *msg)
         u_int32_t divert_info = 0;              /* packet divert/tee info */          u_int32_t divert_info = 0;              /* packet divert/tee info */
         struct ip_fw_args args;          struct ip_fw_args args;
         int srcrt = 0;                          /* forward (by PFIL_HOOKS) */          int srcrt = 0;                          /* forward (by PFIL_HOOKS) */
           boolean_t needredispatch = FALSE;
 #ifdef PFIL_HOOKS  #ifdef PFIL_HOOKS
         struct in_addr odst;                    /* original dst address(NAT) */          struct in_addr odst;                    /* original dst address(NAT) */
 #endif  #endif
Line 808  found: Line 860  found:
                 if (m == 0)                  if (m == 0)
                         return;                          return;
                 ipstat.ips_reassembled++;                  ipstat.ips_reassembled++;
                   needredispatch = TRUE;
                 ip = mtod(m, struct ip *);                  ip = mtod(m, struct ip *);
                 /* Get the header length of the reassembled packet */                  /* Get the header length of the reassembled packet */
                 hlen = IP_VHL_HL(ip->ip_vhl) << 2;                  hlen = IP_VHL_HL(ip->ip_vhl) << 2;
Line 921  DPRINTF(("ip_input: no SP, packet discar Line 974  DPRINTF(("ip_input: no SP, packet discar
         }          }
 #endif /* FAST_IPSEC */  #endif /* FAST_IPSEC */
   
         /*  
          * Switch out to protocol's input routine.  
          *  
          * XXX queue packet to protocol's message port.  
          */  
         ipstat.ips_delivered++;          ipstat.ips_delivered++;
        if (args.next_hop && ip->ip_p == IPPROTO_TCP) {        if (needredispatch) {
                /* TCP needs IPFORWARD info if available */                struct netmsg_transport_packet *msg;
                struct m_hdr tag;                lwkt_port_t port;
 
                 msg = malloc(sizeof(struct netmsg_transport_packet),
                     M_LWKTMSG, M_NOWAIT);
                 if (!msg)
                         goto bad;
                 lwkt_initmsg_rp(&msg->nm_lmsg, &netisr_afree_rport,
                     CMD_NETMSG_ONCPU);
                 msg->nm_handler = transport_processing_handler;
                 msg->nm_mbuf = m;
                 msg->nm_hlen = hlen;
                 msg->nm_hasnexthop = (args.next_hop != NULL);
                 if (msg->nm_hasnexthop)
                         msg->nm_nexthop = *args.next_hop;  /* structure copy */
   
                tag.mh_type = MT_TAG;                ip->ip_off = htons(ip->ip_off);
                tag.mh_flags = PACKET_TAG_IPFORWARD;                ip->ip_len = htons(ip->ip_len);
                tag.mh_data = (caddr_t)args.next_hop;                port = ip_mport(m);
                tag.mh_next = m;                ip->ip_len = ntohs(ip->ip_len);
                 ip->ip_off = ntohs(ip->ip_off);
   
                (*inetsw[ip_protox[ip->ip_p]].pr_input)(                lwkt_sendmsg(port, &msg->nm_lmsg);
                        (struct mbuf *)&tag, hlen, ip->ip_p);        } else {
        } else {                transport_processing_oncpu(m, hlen, ip, args.next_hop);
                (*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen, ip->ip_p); 
         }          }
         return;          return;
 bad:  bad:

Removed from v.1.14  
changed lines
  Added in v.1.15