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/netinet/accf_dns.c

Version: -  FREEBSD  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-2  -  FREEBSD-11-1  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-4  -  FREEBSD-10-3  -  FREEBSD-10-2  -  FREEBSD-10-1  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-3  -  FREEBSD-9-2  -  FREEBSD-9-1  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-4  -  FREEBSD-8-3  -  FREEBSD-8-2  -  FREEBSD-8-1  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-4  -  FREEBSD-7-3  -  FREEBSD-7-2  -  FREEBSD-7-1  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-4  -  FREEBSD-6-3  -  FREEBSD-6-2  -  FREEBSD-6-1  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-5  -  FREEBSD-5-4  -  FREEBSD-5-3  -  FREEBSD-5-2  -  FREEBSD-5-1  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD5  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  xnu-1456.1.26  -  xnu-1699.24.8  -  xnu-2050.18.24  -  OPENSOLARIS  -  minix-3-1-1 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (C) 2007 David Malone <dwmalone@FreeBSD.org>
    3  * 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  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  *
   26  *      $FreeBSD: releng/10.3/sys/netinet/accf_dns.c 193272 2009-06-01 21:17:03Z jhb $
   27  */
   28 
   29 #define ACCEPT_FILTER_MOD
   30 
   31 #include <sys/param.h>
   32 #include <sys/kernel.h>
   33 #include <sys/mbuf.h>
   34 #include <sys/module.h>
   35 #include <sys/signalvar.h>
   36 #include <sys/sysctl.h>
   37 #include <sys/socketvar.h>
   38 
   39 /* check for full DNS request */
   40 static int sohasdns(struct socket *so, void *arg, int waitflag);
   41 
   42 struct packet {
   43         struct mbuf *m;         /* Current mbuf. */
   44         struct mbuf *n;         /* nextpkt mbuf. */
   45         unsigned long moff;     /* Offset of the beginning of m. */
   46         unsigned long offset;   /* Which offset we are working at. */
   47         unsigned long len;      /* The number of bytes we have to play with. */
   48 };
   49 
   50 #define DNS_OK 0
   51 #define DNS_WAIT -1
   52 #define DNS_RUN -2
   53 
   54 /* check we can skip over various parts of DNS request */
   55 static int skippacket(struct sockbuf *sb);
   56 
   57 static struct accept_filter accf_dns_filter = {
   58         "dnsready",
   59         sohasdns,
   60         NULL,
   61         NULL
   62 };
   63 
   64 static moduledata_t accf_dns_mod = {
   65         "accf_dns",
   66         accept_filt_generic_mod_event,
   67         &accf_dns_filter
   68 };
   69 
   70 DECLARE_MODULE(accf_dns, accf_dns_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
   71 
   72 static int
   73 sohasdns(struct socket *so, void *arg, int waitflag)
   74 {
   75         struct sockbuf *sb = &so->so_rcv;
   76 
   77         /* If the socket is full, we're ready. */
   78         if (sb->sb_cc >= sb->sb_hiwat || sb->sb_mbcnt >= sb->sb_mbmax)
   79                 goto ready;
   80 
   81         /* Check to see if we have a request. */
   82         if (skippacket(sb) == DNS_WAIT)
   83                 return (SU_OK);
   84 
   85 ready:
   86         return (SU_ISCONNECTED);
   87 }
   88 
   89 #define GET8(p, val) do { \
   90         if (p->offset < p->moff) \
   91                 return DNS_RUN; \
   92         while (p->offset >= p->moff + p->m->m_len) { \
   93                 p->moff += p->m->m_len; \
   94                 p->m = p->m->m_next; \
   95                 if (p->m == NULL) { \
   96                         p->m = p->n; \
   97                         p->n = p->m->m_nextpkt; \
   98                 } \
   99                 if (p->m == NULL) \
  100                         return DNS_WAIT; \
  101         } \
  102         val = *(mtod(p->m, unsigned char *) + (p->offset - p->moff)); \
  103         p->offset++; \
  104         } while (0)
  105 
  106 #define GET16(p, val) do { \
  107         unsigned int v0, v1; \
  108         GET8(p, v0); \
  109         GET8(p, v1); \
  110         val = v0 * 0x100 + v1; \
  111         } while (0)
  112 
  113 static int
  114 skippacket(struct sockbuf *sb) {
  115         unsigned long packlen;
  116         struct packet q, *p = &q;
  117 
  118         if (sb->sb_cc < 2)
  119                 return DNS_WAIT;
  120 
  121         q.m = sb->sb_mb;
  122         q.n = q.m->m_nextpkt;
  123         q.moff = 0;
  124         q.offset = 0;
  125         q.len = sb->sb_cc;
  126 
  127         GET16(p, packlen);
  128         if (packlen + 2 > q.len)
  129                 return DNS_WAIT;
  130 
  131         return DNS_OK;
  132 }

Cache object: 55fb84cca2ddbfc18fd4de293cfe742d


[ 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.