123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- enum {
- NbNameLen = 16,
- NbnsTimeoutBroadcast = 1000,
- NbnsRetryBroadcast = 3,
- NbnsPort = 137,
- NbDgramMaxLen = 576,
- };
- typedef struct NbnsHdr {
- uchar name_trn_id[2];
- uchar ctrl[2];
- uchar qdcount[2];
- uchar ancount[2];
- uchar nscount[2];
- uchar arcount[2];
- } NbnsHdr;
- enum {
- NbnsResponse = 1 << 15
- };
- enum {
- NbnsOpShift = 11,
- NbnsOpMask = 0xf,
- NbnsOpQuery = 0,
- NbnsOpRegistration = 5,
- NbnsOpRelease = 6,
- NbnsOpWack = 7,
- NbnsOpRefresh = 8
- };
- enum {
- NbnsFlagBroadcast = (1 << 4),
- NbnsFlagRecursionAvailable = (1 << 7),
- NbnsFlagRecursionDesired = (1 << 8),
- NbnsFlagTruncation = (1 << 9),
- NbnsFlagAuthoritativeAnswer = (1 << 10),
- };
- enum {
- NbnsRcodeShift = 0,
- NbnsRcodeMask = 0xf,
- };
- enum {
- NbnsQuestionTypeNb = 0x0020,
- NbnsQuestionTypeNbStat = 0x0021,
- NbnsQuestionClassIn = 0x0001,
- };
- enum {
- NbnsResourceTypeA = 0x0001,
- NbnsResourceTypeNs = 0x0002,
- NbnsResourceTypeNull = 0x000a,
- NbnsResourceTypeNb = 0x0020,
- NbnsResourceTypeNbStat = 0x0021,
- NbnsResourceClassIn = 0x0001,
- };
- typedef struct NbnsMessageQuestion NbnsMessageQuestion;
- typedef struct NbnsMessageResource NbnsMessageResource;
- typedef uchar NbName[NbNameLen];
- int nbnamedecode(uchar *base, uchar *p, uchar *ep, NbName name);
- int nbnameencode(uchar *p, uchar *ep, NbName name);
- int nbnameequal(NbName name1, NbName name2);
- void nbnamecpy(NbName n1, NbName n2);
- void nbmknamefromstring(NbName nbname, char *string);
- void nbmknamefromstringandtype(NbName nbname, char *string, uchar type);
- void nbmkstringfromname(char *buf, int buflen, NbName name);
- #pragma varargck type "B" uchar *
- int nbnamefmt(Fmt *);
- struct NbnsMessageQuestion {
- NbName name;
- ushort type;
- ushort class;
- NbnsMessageQuestion *next;
- };
- NbnsMessageQuestion *nbnsmessagequestionnew(NbName name, ushort type, ushort class);
- struct NbnsMessageResource {
- NbName name;
- ushort type;
- ushort class;
- ulong ttl;
- ushort rdlength;
- uchar *rdata;
- NbnsMessageResource *next;
- };
- NbnsMessageResource *nbnsmessageresourcenew(NbName name, ushort type, ushort class, ulong ttl, int rdcount, uchar *rdata);
- typedef struct NbnsMessage {
- ushort id;
- int response;
- int opcode;
- int broadcast;
- int recursionavailable;
- int recursiondesired;
- int truncation;
- int authoritativeanswer;
- int rcode;
- NbnsMessageQuestion *q;
- NbnsMessageResource *an;
- NbnsMessageResource *ns;
- NbnsMessageResource *ar;
- } NbnsMessage;
- NbnsMessage *nbnsmessagenew(void);
- void nbnsmessageaddquestion(NbnsMessage *s, NbnsMessageQuestion *q);
- void nbnsmessageaddresource(NbnsMessageResource **rp, NbnsMessageResource *r);
- NbnsMessage *nbnsconvM2S(uchar *ap, int nap);
- void nbnsmessagefree(NbnsMessage **sp);
- void nbnsdumpmessage(NbnsMessage *s);
- int nbnsconvS2M(NbnsMessage *s, uchar *ap, int nap);
- NbnsMessage *nbnsmessagenamequeryrequestnew(ushort id, int broadcast, NbName name);
- NbnsMessage *nbnsmessagenameregistrationrequestnew(ushort id, int broadcast, NbName name, ulong ttl, uchar *ipaddr);
- typedef struct NbnsTransaction NbnsTransaction;
- struct NbnsTransaction {
- ushort id;
- Channel *c;
- NbnsTransaction *next;
- };
- ushort nbnsnextid(void);
- int nbnsfindname(uchar *serveripaddr, NbName name, uchar *ipaddr, ulong *ttlp);
- int nbnsaddname(uchar *serveripaddr, NbName name, ulong ttl, uchar *ipaddr);
- NbnsTransaction *nbnstransactionnew(NbnsMessage *request, uchar *ipaddr);
- void nbnstransactionfree(NbnsTransaction **tp);
- typedef struct NbnsAlarm NbnsAlarm;
- struct NbnsAlarm {
- Channel *c;
- vlong expirems;
- NbnsAlarm *next;
- };
- void nbnsalarmset(NbnsAlarm *a, ulong millisec);
- void nbnsalarmcancel(NbnsAlarm *a);
- void nbnsalarmfree(NbnsAlarm **ap);
- NbnsAlarm *nbnsalarmnew(void);
- void nbnsalarmend(void);
- typedef struct NbSession NbSession;
- typedef int NBSSWRITEFN(NbSession *s, void *buf, long n);
- struct NbSession {
- int fd;
- void *magic;
- NbName from;
- NbName to;
- };
- int nbsslisten(NbName to, NbName from, int (*accept)(void *magic, NbSession *s, NBSSWRITEFN **write), void *magic);
- NbSession *nbssconnect(NbName to, NbName from);
- void nbssfree(NbSession *s);
- typedef struct NbScatterGather NbScatterGather;
- struct NbScatterGather {
- void *p;
- long l;
- };
- int nbssgatherwrite(NbSession *s, NbScatterGather *a);
- long nbssscatterread(NbSession *, NbScatterGather *a);
- int nbsswrite(NbSession *s, void *buf, long n);
- long nbssread(NbSession *s, void *buf, long n);
- void *nbemalloc(ulong);
- int nbnameresolve(NbName name, uchar *ipaddr);
- void nbdumpdata(void *data, long datalen);
- typedef struct NbDgram {
- uchar type;
- uchar flags;
- ushort id;
- uchar srcip[IPaddrlen];
- ushort srcport;
- union {
- struct {
- ushort length;
- ushort offset;
- NbName srcname;
- NbName dstname;
- uchar *data;
- } datagram;
- struct {
- uchar code;
- } error;
- struct {
- NbName dstname;
- } query;
- };
- } NbDgram;
- enum {
- NbDgramDirectUnique = 0x10,
- NbDgramDirectGroup,
- NbDgramBroadcast,
- NbDgramError,
- NbDgramQueryRequest,
- NbDgramPositiveQueryResponse,
- NbDgramNegativeQueryResponse,
- NbDgramMore = 1,
- NbDgramFirst = 2,
- NbDgramPort = 138,
- NbDgramErrorDestinationNameNotPresent = 0x82,
- NbDgramMaxPacket = 576,
- };
- typedef struct NbDgramSendParameters {
- NbName to;
- uchar type;
- } NbDgramSendParameters;
- int nbdgramconvM2S(NbDgram *s, uchar *p, uchar *ep);
- int nbdgramconvS2M(uchar *p, uchar *ep, NbDgram *s);
- void nbdgramdump(NbDgram *s);
- int nbdgramsendto(uchar *ipaddr, ushort port, NbDgram *s);
- int nbdgramsend(NbDgramSendParameters *p, unsigned char *data, long datalen);
- char *nbdgramlisten(NbName to, int (*deliver)(void *magic, NbDgram *s), void *magic);
- int nbnametablefind(NbName name, int add);
- int nbnameisany(NbName name);
- int nbremotenametablefind(NbName name, uchar *ipaddr);
- int nbremotenametableadd(NbName name, uchar *ipaddr, ulong ttl);
- typedef struct NbGlobals {
- uchar myipaddr[IPaddrlen];
- uchar bcastaddr[IPaddrlen];
- NbName myname;
- } NbGlobals;
- extern NbGlobals nbglobals;
- extern NbName nbnameany;
- int nbinit(void);
- char *nbudpannounce(ushort port, int *fdp);
- extern int nbudphdrsize;
|