Annotation of lucent/sys/src/9/port/ipdat.h, revision 1.1.1.1

1.1       root        1: typedef struct Etherhdr        Etherhdr;
                      2: typedef struct Fragq   Fragq;
                      3: typedef struct Ilcb    Ilcb;
                      4: typedef struct Ilhdr   Ilhdr;
                      5: typedef ulong          Ipaddr;
                      6: typedef struct Ipconv  Ipconv;
                      7: typedef struct Ipfrag  Ipfrag;
                      8: typedef struct Ipifc   Ipifc;
                      9: typedef struct Ipdevice        Ipdevice;
                     10: typedef ushort         Port;
                     11: typedef struct Reseq   Reseq;
                     12: typedef struct Tcp     Tcp;
                     13: typedef struct Tcpctl  Tcpctl;
                     14: typedef struct Tcphdr  Tcphdr;
                     15: typedef struct Timer   Timer;
                     16: typedef struct Udphdr  Udphdr;
                     17: 
                     18: struct Etherhdr
                     19: {
                     20: #define ETHER_HDR      14
                     21:        uchar   d[6];
                     22:        uchar   s[6];
                     23:        uchar   type[2];
                     24: 
                     25:        /* Now we have the ip fields */
                     26: #define ETHER_IPHDR    20
                     27:        uchar   vihl;           /* Version and header length */
                     28:        uchar   tos;            /* Type of service */
                     29:        uchar   length[2];      /* packet length */
                     30:        uchar   id[2];          /* Identification */
                     31:        uchar   frag[2];        /* Fragment information */
                     32:        uchar   ttl;            /* Time to live */
                     33:        uchar   proto;          /* Protocol */
                     34:        uchar   cksum[2];       /* Header checksum */
                     35:        uchar   src[4];         /* Ip source */
                     36:        uchar   dst[4];         /* Ip destination */
                     37: };
                     38: 
                     39: /* Ethernet packet types */
                     40: #define ET_IP  0x0800
                     41: 
                     42: struct Udphdr
                     43: {
                     44: #define UDP_EHSIZE     22
                     45:        uchar   d[6];           /* Ethernet destination */
                     46:        uchar   s[6];           /* Ethernet source */
                     47:        uchar   type[2];        /* Ethernet packet type */
                     48: 
                     49:        uchar   vihl;           /* Version and header length */
                     50:        uchar   tos;            /* Type of service */
                     51:        uchar   length[2];      /* packet length */
                     52:        uchar   id[2];          /* Identification */
                     53:        uchar   frag[2];        /* Fragment information */
                     54: 
                     55:        /* Udp pseudo ip really starts here */
                     56: #define UDP_PHDRSIZE   12
                     57: #define UDP_HDRSIZE    20
                     58:        uchar   Unused; 
                     59:        uchar   udpproto;       /* Protocol */
                     60:        uchar   udpplen[2];     /* Header plus data length */
                     61:        uchar   udpsrc[4];      /* Ip source */
                     62:        uchar   udpdst[4];      /* Ip destination */
                     63:        uchar   udpsport[2];    /* Source port */
                     64:        uchar   udpdport[2];    /* Destination port */
                     65:        uchar   udplen[2];      /* data length */
                     66:        uchar   udpcksum[2];    /* Checksum */
                     67: };
                     68: 
                     69: struct Ilhdr
                     70: {
                     71: #define IL_EHSIZE      34
                     72:        uchar   d[6];           /* Ethernet destination */
                     73:        uchar   s[6];           /* Ethernet source */
                     74:        uchar   type[2];        /* Ethernet packet type */
                     75: 
                     76:        uchar   vihl;           /* Version and header length */
                     77:        uchar   tos;            /* Type of service */
                     78:        uchar   length[2];      /* packet length */
                     79:        uchar   id[2];          /* Identification */
                     80:        uchar   frag[2];        /* Fragment information */
                     81:        uchar   ttl;            /* Time to live */
                     82:        uchar   proto;          /* Protocol */
                     83:        uchar   cksum[2];       /* Header checksum */
                     84:        uchar   src[4];         /* Ip source */
                     85:        uchar   dst[4];         /* Ip destination */
                     86: #define IL_HDRSIZE     18      
                     87:        uchar   ilsum[2];       /* Checksum including header */
                     88:        uchar   illen[2];       /* Packet length */
                     89:        uchar   iltype;         /* Packet type */
                     90:        uchar   ilspec;         /* Special */
                     91:        uchar   ilsrc[2];       /* Src port */
                     92:        uchar   ildst[2];       /* Dst port */
                     93:        uchar   ilid[4];        /* Sequence id */
                     94:        uchar   ilack[4];       /* Acked sequence */
                     95: };
                     96: 
                     97: struct Ilcb                    /* Control block */
                     98: {
                     99:        int     state;          /* Connection state */
                    100: 
                    101:        Rendez  syncer;         /* where syncer waits for a connect */
                    102: 
                    103:        QLock   ackq;           /* Unacknowledged queue */
                    104:        Block   *unacked;
                    105:        Block   *unackedtail;
                    106: 
                    107:        QLock   outo;           /* Out of order packet queue */
                    108:        Block   *outoforder;
                    109: 
                    110:        ulong   next;           /* Id of next to send */
                    111:        ulong   recvd;          /* Last packet received */
                    112:        ulong   start;          /* Local start id */
                    113:        ulong   rstart;         /* Remote start id */
                    114: 
                    115:        int     timeout;        /* Time out counter */
                    116:        int     slowtime;       /* Slow time counter */
                    117:        int     fasttime;       /* Retransmission timer */
                    118:        int     acktime;        /* Acknowledge timer */
                    119:        int     querytime;      /* Query timer */
                    120:        int     deathtime;      /* Time to kill connection */
                    121: 
                    122:        int     rtt;            /* Average round trip time */
                    123:        ulong   rttack;         /* The ack we are waiting for */
                    124:        ulong   ackms;          /* Time we issued */
                    125: 
                    126:        int     window;         /* Maximum receive window */
                    127: };
                    128: 
                    129: enum                           /* Packet types */
                    130: {
                    131:        Ilsync,
                    132:        Ildata,
                    133:        Ildataquery,
                    134:        Ilack,
                    135:        Ilquerey,
                    136:        Ilstate,
                    137:        Ilclose,
                    138: };
                    139: 
                    140: enum                           /* Connection state */
                    141: {
                    142:        Ilclosed,
                    143:        Ilsyncer,
                    144:        Ilsyncee,
                    145:        Ilestablished,
                    146:        Illistening,
                    147:        Ilclosing,
                    148: };
                    149: 
                    150: #define TCP_PKT        (TCP_EHSIZE+TCP_IPLEN+TCP_PHDRSIZE)
                    151: 
                    152: struct Tcphdr
                    153: {
                    154: #define TCP_EHSIZE     14
                    155:        uchar   d[6];           /* Ethernet destination */
                    156:        uchar   s[6];           /* Ethernet source */
                    157:        uchar   type[2];        /* Ethernet packet type */
                    158: #define TCP_IPLEN      8
                    159:        uchar   vihl;           /* Version and header length */
                    160:        uchar   tos;            /* Type of service */
                    161:        uchar   length[2];      /* packet length */
                    162:        uchar   id[2];          /* Identification */
                    163:        uchar   frag[2];        /* Fragment information */
                    164: 
                    165: #define TCP_PHDRSIZE   12      
                    166:        uchar   Unused;
                    167:        uchar   proto;
                    168:        uchar   tcplen[2];
                    169:        uchar   tcpsrc[4];
                    170:        uchar   tcpdst[4];
                    171: 
                    172: #define TCP_HDRSIZE    20
                    173:        uchar   tcpsport[2];
                    174:        uchar   tcpdport[2];
                    175:        uchar   tcpseq[4];
                    176:        uchar   tcpack[4];
                    177:        uchar   tcpflag[2];
                    178:        uchar   tcpwin[2];
                    179:        uchar   tcpcksum[2];
                    180:        uchar   tcpurg[2];
                    181: 
                    182:        /* Options segment */
                    183:        uchar   tcpopt[2];
                    184:        uchar   tcpmss[2];
                    185: };
                    186: 
                    187: enum
                    188: {
                    189:        TimerOFF        = 0,
                    190:        TimerON         = 1,
                    191:        TimerDONE       = 2,
                    192: };
                    193: 
                    194: struct Timer
                    195: {
                    196:        Timer   *next;
                    197:        Timer   *prev;
                    198:        int     state;
                    199:        int     start;
                    200:        int     count;
                    201:        void    (*func)(void*);
                    202:        void    *arg;
                    203: };
                    204: 
                    205: struct Tctl
                    206: {
                    207:        uchar   state;                  /* Connection state */
                    208:        uchar   type;                   /* Listening or active connection */
                    209:        uchar   code;                   /* Icmp code */         
                    210:        struct {
                    211:                ulong   una;            /* Unacked data pointer */
                    212:                ulong   nxt;            /* Next sequence expected */
                    213:                ulong   ptr;            /* Data pointer */
                    214:                ushort  wnd;            /* Tcp send window */
                    215:                ulong   up;             /* Urgent data pointer */
                    216:                ulong   wl1;
                    217:                ulong   wl2;
                    218:        } snd;
                    219:        struct {
                    220:                ulong   nxt;            /* Receive pointer to next byte slot */
                    221:                ushort  wnd;            /* Receive window incoming */
                    222:                ulong   up;             /* Urgent pointer */
                    223:        } rcv;
                    224:        ulong   iss;                    /* Initial sequence number */
                    225:        ushort  cwind;                  /* Congestion window */
                    226:        ushort  ssthresh;               /* Slow start threshold */
                    227:        int     resent;                 /* Bytes just resent */
                    228:        int     irs;                    /* Initial received squence */
                    229:        ushort  mss;                    /* Mean segment size */
                    230:        int     rerecv;                 /* Overlap of data rerecevived */
                    231:        ushort  window;                 /* Recevive window */
                    232:        int     max_snd;                /* Max send */
                    233:        ulong   last_ack;               /* Last acknowledege received */
                    234:        char    backoff;                /* Exponential backoff counter */
                    235:        char    flags;                  /* State flags */
                    236:        char    tos;                    /* Type of service */
                    237: 
                    238:        Blist   rcvq;                   /* Received data */
                    239:        ulong   rcvcnt;                 /* Bytes queued for upstream */
                    240: 
                    241:        Block   *sndq;                  /* List of data going out */
                    242:        ulong   sndcnt;                 /* Amount of data in send queue */
                    243:        Rendez  sndr;                   /* process flow control */
                    244:        QLock   sndrlock;
                    245:        int     sndfull;
                    246: 
                    247:        Reseq   *reseq;                 /* Resequencing queue */
                    248:        Timer   timer;                  /* Activity timer */
                    249:        Timer   acktimer;               /* Acknoledge timer */
                    250:        Timer   rtt_timer;              /* Round trip timer */
                    251:        ulong   rttseq;                 /* Round trip sequence */
                    252:        int     srtt;                   /* Shortened round trip */
                    253:        int     mdev;                   /* Mean deviation of round trip */
                    254:        int     kacounter;              /* when counter goes to zero, hangup */
                    255: };
                    256: 
                    257: struct Tcpctl
                    258: {
                    259:        QLock;
                    260:        Rendez syner;
                    261:        struct Tctl;
                    262: };
                    263: 
                    264: struct Tcp
                    265: {
                    266:        Port    source;
                    267:        Port    dest;
                    268:        ulong   seq;
                    269:        ulong   ack;
                    270:        char    flags;
                    271:        ushort  wnd;
                    272:        ushort  up;
                    273:        ushort  mss;
                    274: };
                    275: 
                    276: struct Reseq
                    277: {
                    278:        Reseq   *next;
                    279:        Tcp     seg;
                    280:        Block   *bp;
                    281:        ushort  length;
                    282:        char    tos;
                    283: };
                    284: 
                    285: /* An ip interface used for UDP/TCP/IL */
                    286: struct Ipconv
                    287: {
                    288:        QLock;                          /* Ref count lock */
                    289:        Netprot;                        /* stat info */
                    290:        int     ref;
                    291:        Ipaddr  dst;                    /* Destination from connect */
                    292:        Ipaddr  src;                    /* local address */
                    293:        Port    psrc;                   /* Source port */
                    294:        Port    pdst;                   /* Destination port */
                    295: 
                    296:        Ipifc   *ifc;                   /* Ip protocol interface */
                    297:        Queue   *readq;                 /* Pointer to upstream read q */
                    298:        QLock   listenq;                /* List of people waiting incoming cons */
                    299:        Rendez  listenr;                /* Some where to sleep while waiting */
                    300:                
                    301:        char    *err;                   /* Async protocol error */
                    302:        int     backlog;                /* Maximum number of waiting connections */
                    303:        int     headers;                /* include header in packet */
                    304:        int     curlog;                 /* Number of waiting connections */
                    305:        Ipconv  *newcon;                /* This is the start of a connection */
                    306:        char    text[NAMELEN];          /* program announcing/connecting port */
                    307: 
                    308:        union {
                    309:                Tcpctl  tcpctl;         /* Tcp control block */
                    310:                Ilcb    ilctl;          /* Il control block */
                    311:        };
                    312: };
                    313: 
                    314: 
                    315: enum
                    316: {
                    317:        MAX_TIME        = (1<<20),      /* Forever */
                    318:        TCP_ACK         = 50,           /* Timed ack sequence in ms */
                    319: 
                    320:        URG             = 0x20,         /* Data marked urgent */
                    321:        ACK             = 0x10,         /* Aknowledge is valid */
                    322:        PSH             = 0x08,         /* Whole data pipe is pushed */
                    323:        RST             = 0x04,         /* Reset connection */
                    324:        SYN             = 0x02,         /* Pkt. is synchronise */
                    325:        FIN             = 0x01,         /* Start close down */
                    326: 
                    327:        EOL_KIND        = 0,
                    328:        NOOP_KIND       = 1,
                    329:        MSS_KIND        = 2,
                    330: 
                    331:        MSS_LENGTH      = 4,            /* Mean segment size */
                    332:        MSL2            = 10,
                    333:        MSPTICK         = 50,           /* Milliseconds per timer tick */
                    334:        DEF_MSS         = 512,          /* Default mean segment */
                    335:        DEF_RTT         = 1000,         /* Default round trip */
                    336: 
                    337:        TCP_PASSIVE     = 0,            /* Listen connection */
                    338:        TCP_ACTIVE      = 1,            /* Outgoing connection */
                    339:        IL_PASSIVE      = 0,
                    340:        IL_ACTIVE       = 1,
                    341: 
                    342:        MAXBACKOFF      = 12,
                    343:        FORCE           = 1,
                    344:        CLONE           = 2,
                    345:        RETRAN          = 4,
                    346:        ACTIVE          = 8,
                    347:        SYNACK          = 16,
                    348:        AGAIN           = 8,
                    349:        DGAIN           = 4,
                    350: };
                    351: 
                    352: #define        set_timer(t,x)  (((t)->start) = (x)/MSPTICK)
                    353: #define        run_timer(t)    ((t)->state == TimerON)
                    354: 
                    355: enum                                   /* Tcp connection states */
                    356: {
                    357:        Closed          = 0,
                    358:        Listen,
                    359:        Syn_sent,
                    360:        Syn_received,
                    361:        Established,
                    362:        Finwait1,
                    363:        Finwait2,
                    364:        Close_wait,
                    365:        Closing,
                    366:        Last_ack,
                    367:        Time_wait
                    368: };
                    369: 
                    370: enum
                    371: {
                    372:        Nipconv=        512,            /* max conversations per interface */
                    373:        Udphdrsize=     6,              /* size if a to/from user Udp header */
                    374:        Nipd=           34,             /* ip hardware interfaces */
                    375: };
                    376: 
                    377: /*
                    378:  * Ip interface structure. We have one for each active protocol driver
                    379:  */
                    380: struct Ipifc 
                    381: {
                    382:        QLock;
                    383:        Network;                                /* user level network interface */
                    384:        Ipifc           *next;
                    385:        int             inited;
                    386:        uchar           protocol;               /* Ip header protocol number */
                    387:        void (*iprcv)   (Ipifc*, Block*);       /* Receive demultiplexor */
                    388:        ulong           chkerrs;                /* checksum errors */
                    389:        Ipconv          **conv;                 /* conversations */
                    390: };
                    391: 
                    392: /*
                    393:  * Ip hardare interface structure. We have one for each physical interface
                    394:  */
                    395: struct Ipdevice
                    396: {
                    397:        Queue   *q;
                    398: 
                    399:        Ipaddr          Myip[7];
                    400:        Ipaddr          Mymask;
                    401:        Ipaddr          Mynetmask;
                    402:        Ipaddr          Remip;          /* address of remote side */
                    403:        uchar           Netmyip[4];     /* In Network byte order */
                    404:        int             maxmtu;         /* Maximum transfer unit */
                    405:        int             minmtu;         /* Minumum tranfer unit */
                    406:        int             hsize;          /* Media header size */
                    407: 
                    408:        int             type;           /* channel identifier */
                    409:        int             dev;
                    410: 
                    411:        QLock           outl;
                    412: };
                    413: 
                    414: struct Fragq
                    415: {
                    416:        QLock;
                    417:        Block  *blist;
                    418:        Fragq  *next;
                    419:        Ipaddr src;
                    420:        Ipaddr dst;
                    421:        ushort id;
                    422:        ulong  age;
                    423: };
                    424: 
                    425: struct Ipfrag
                    426: {
                    427:        ushort  foff;
                    428:        ushort  flen;
                    429: };
                    430: 
                    431: enum {
                    432:        IP_VER          = 0x40,                 /* Using IP version 4 */
                    433:        IP_HLEN         = 0x05,                 /* Header length in characters */
                    434:        IP_DF           = 0x4000,               /* Don't fragment */
                    435:        IP_MF           = 0x2000,               /* More fragments */
                    436: 
                    437:        /* Sizes */
                    438:        IP_MAX          = (32*1024),            /* Maximum Internet packet size */
                    439:        UDP_MAX         = (IP_MAX-ETHER_IPHDR), /* Maximum UDP datagram size */
                    440:        UDP_DATMAX      = (UDP_MAX-UDP_HDRSIZE),/* Maximum amount of udp data */
                    441:        IL_DATMAX       = (IP_MAX-IL_HDRSIZE),  /* Maximum IL data in one ip packet */
                    442: 
                    443:        /* Protocol numbers */
                    444:        IP_ICMPPROTO    = 1,
                    445:        IP_UDPPROTO     = 17,
                    446:        IP_TCPPROTO     = 6,
                    447:        IP_ILPROTO      = 40,
                    448: 
                    449:        /* Psuedo protocol - not on the wire */
                    450:        IP_ROUTER       = 128,
                    451: 
                    452:        /* Protocol port numbers */
                    453:        PORTALLOC       = 5000,                 /* First automatic allocated port */
                    454:        PRIVPORTALLOC   = 600,                  /* First priveleged port allocated */
                    455:        UNPRIVPORTALLOC = 1024,                 /* First unpriveleged port allocated */
                    456:        PORTMAX         = 30000,                /* Last port to allocte */
                    457: };
                    458: 
                    459: void   add_reseq(Tcpctl *, char, Tcp *, Block *, ushort);
                    460: int    arp_lookup(uchar*, uchar*);
                    461: int    backoff(int);
                    462: Block* btrim(Block*, int, int);
                    463: void   localclose(Ipconv *, char []);
                    464: int    dupb(Block **, Block *, int, int);
                    465: void   extract_oob(Block **, Block **, Tcp *);
                    466: void   get_reseq(Tcpctl *, char *, Tcp *, Block **, ushort *);
                    467: Ipaddr ipgetsrc(uchar*);
                    468: void   hnputl(uchar*, ulong);
                    469: void   hnputs(uchar*, ushort);
                    470: Block* htontcp(Tcp *, Block *, Tcphdr *);
                    471: Block* htontcp(Tcp *, Block *, Tcphdr *);
                    472: void   iloutoforder(Ipconv*, Ilhdr*, Block*);
                    473: void   ilstart(Ipconv *, int, int);
                    474: int    inb_window(Tcpctl *, int);
                    475: void   init_tcpctl(Ipconv *);
                    476: void   initfrag(int);
                    477: void   initipifc(Ipifc*, uchar, void (*)(Ipifc*, Block*));
                    478: Ipconv*        ip_conn(Ipifc*, Port, Port, Ipaddr dest);
                    479: ushort ip_csum(uchar*);
                    480: Block* ip_reassemble(int, Block*, Etherhdr*);
                    481: int    ipclonecon(Chan *);
                    482: int    ipconbusy(Ipconv*);
                    483: Ipconv*        ipcreateconv(Ipifc*, int);
                    484: int    ipforme(uchar*);
                    485: Fragq* ipfragallo(void);
                    486: void   ipfragfree(Fragq*, int);
                    487: Ipconv*        ipincoming(Ipifc*, Ipconv*);
                    488: int    iplisten(Chan *);
                    489: void   iplocalfill(Chan*, char*, int);
                    490: void   ipmkdir(Qinfo *, Dirtab *, Ipconv *);
                    491: Ipaddr ipparse(char*);
                    492: void   ipremotefill(Chan*, char*, int);
                    493: Ipdevice*      iproute(uchar*, uchar*);
                    494: void   ipsetaddrs(Ipdevice*);
                    495: void   ipstatusfill(Chan*, char*, int);
                    496: Port   nextport(Ipifc*, int);
                    497: ushort nhgets(uchar*);
                    498: ulong  nhgetl(uchar*);
                    499: int    ntohtcp(Tcp *, Block **);
                    500: int    ntohtcp(Tcp*, Block**);
                    501: Ipconv*        portused(Ipifc*, Port);
                    502: void   ppkt(Block*);
                    503: void   proc_syn(Ipconv*, char, Tcp*);
                    504: ushort ptcl_csum(Block*bp, int, int);
                    505: int    pullb(Block **, int);
                    506: void   reset(Ipaddr, Ipaddr, char, ushort, Tcp*);
                    507: void   tcpsndsyn(Tcpctl*);
                    508: int    seq_ge(ulong, ulong);
                    509: int    seq_gt(ulong, ulong);
                    510: int    seq_gt(ulong, ulong);
                    511: int    seq_le(ulong, ulong);
                    512: int    seq_lt(ulong, ulong);
                    513: int    seq_within(ulong, ulong, ulong);
                    514: int    seq_within(ulong, ulong, ulong);
                    515: void   tcpsetstate(Ipconv *, char);
                    516: void   tcpgo(Timer *);
                    517: void   tcphalt(Timer *);
                    518: void   tcpxstate(Ipconv*, char oldstate, char newstate);
                    519: void   tcpacktimer(void *);
                    520: void   tcpinput(Ipifc*, Block *);
                    521: void   tcpoutput(Ipconv*);
                    522: void   tcptimeout(void *);
                    523: void   tcpackproc(void*);
                    524: void   tcpflow(void*);
                    525: void   tcpflushincoming(Ipconv*);
                    526: void   tcprcvwin(Ipconv *);
                    527: void   tcpstart(Ipconv *, int, ushort, char);
                    528: int    trim(Tcpctl *, Tcp *, Block **, ushort *);
                    529: void   udprcvmsg(Ipifc*, Block*);
                    530: void   update(Ipconv *, Tcp *);
                    531: 
                    532: #define        fmtaddr(xx)     (xx>>24)&0xff,(xx>>16)&0xff,(xx>>8)&0xff,xx&0xff
                    533: #define        MIN(a, b)       ((a) < (b) ? (a) : (b))
                    534: #define MAX(a, b)      ((a) > (b) ? (a) : (b))
                    535: #define BLKIP(xp)      ((Etherhdr *)((xp)->rptr))
                    536: #define BLKFRAG(xp)    ((Ipfrag *)((xp)->base))
                    537: #define PREC(x)                ((x)>>5 & 7)
                    538: 
                    539: extern Ipaddr Myip[7];
                    540: extern Ipaddr Mymask;
                    541: extern Ipaddr Mynetmask;
                    542: extern Ipaddr classmask[4];
                    543: extern Ipifc *ipifc[];
                    544: extern Ipdevice ipd[Nipd];
                    545: extern char *tcpstate[];
                    546: extern char *ilstate[];
                    547: extern Rendez tcpflowr;
                    548: extern Qinfo tcpinfo;
                    549: extern Qinfo ipinfo;
                    550: extern Qinfo ipconvinfo;
                    551: extern Qinfo udpinfo;
                    552: extern Qinfo ilinfo;
                    553: extern Qinfo arpinfo;
                    554: extern Queue *Ipoutput;
                    555: 
                    556: /* offsets into Myip */
                    557: enum
                    558: {
                    559:        Myself          = 0,
                    560:        Mybcast         = 1,
                    561:        Mynet           = 3,
                    562:        Mysubnet        = 5,
                    563: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.