1 enum { 2 NbNameLen = 16, 3 NbnsTimeoutBroadcast = 1000, 4 NbnsRetryBroadcast = 3, 5 NbnsPort = 137, 6 NbDgramMaxLen = 576, 7 }; 8 9 typedef struct NbnsHdr { 10 uchar name_trn_id[2]; 11 uchar ctrl[2]; 12 uchar qdcount[2]; 13 uchar ancount[2]; 14 uchar nscount[2]; 15 uchar arcount[2]; 16 } NbnsHdr; 17 18 enum { 19 NbnsResponse = 1 << 15 20 }; 21 22 enum { 23 NbnsOpShift = 11, 24 NbnsOpMask = 0xf, 25 NbnsOpQuery = 0, 26 NbnsOpRegistration = 5, 27 NbnsOpRelease = 6, 28 NbnsOpWack = 7, 29 NbnsOpRefresh = 8 30 }; 31 32 enum { 33 NbnsFlagBroadcast = (1 << 4), 34 NbnsFlagRecursionAvailable = (1 << 7), 35 NbnsFlagRecursionDesired = (1 << 8), 36 NbnsFlagTruncation = (1 << 9), 37 NbnsFlagAuthoritativeAnswer = (1 << 10), 38 }; 39 40 enum { 41 NbnsRcodeShift = 0, 42 NbnsRcodeMask = 0xf, 43 }; 44 45 enum { 46 NbnsQuestionTypeNb = 0x0020, 47 NbnsQuestionTypeNbStat = 0x0021, 48 NbnsQuestionClassIn = 0x0001, 49 }; 50 51 enum { 52 NbnsResourceTypeA = 0x0001, 53 NbnsResourceTypeNs = 0x0002, 54 NbnsResourceTypeNull = 0x000a, 55 NbnsResourceTypeNb = 0x0020, 56 NbnsResourceTypeNbStat = 0x0021, 57 NbnsResourceClassIn = 0x0001, 58 }; 59 60 typedef struct NbnsMessageQuestion NbnsMessageQuestion; 61 typedef struct NbnsMessageResource NbnsMessageResource; 62 63 typedef uchar NbName[NbNameLen]; 64 int nbnamedecode(uchar *base, uchar *p, uchar *ep, NbName name); 65 int nbnameencode(uchar *p, uchar *ep, NbName name); 66 int nbnameequal(NbName name1, NbName name2); 67 void nbnamecpy(NbName n1, NbName n2); 68 void nbmknamefromstring(NbName nbname, char *string); 69 void nbmknamefromstringandtype(NbName nbname, char *string, uchar type); 70 void nbmkstringfromname(char *buf, int buflen, NbName name); 71 #pragma varargck type "B" uchar * 72 73 int nbnamefmt(Fmt *); 74 75 struct NbnsMessageQuestion { 76 NbName name; 77 ushort type; 78 ushort class; 79 NbnsMessageQuestion *next; 80 }; 81 82 NbnsMessageQuestion *nbnsmessagequestionnew(NbName name, ushort type, ushort class); 83 84 struct NbnsMessageResource { 85 NbName name; 86 ushort type; 87 ushort class; 88 ulong ttl; 89 ushort rdlength; 90 uchar *rdata; 91 NbnsMessageResource *next; 92 }; 93 NbnsMessageResource *nbnsmessageresourcenew(NbName name, ushort type, ushort class, ulong ttl, int rdcount, uchar *rdata); 94 95 typedef struct NbnsMessage { 96 ushort id; 97 int response; 98 int opcode; 99 int broadcast; 100 int recursionavailable; 101 int recursiondesired; 102 int truncation; 103 int authoritativeanswer; 104 int rcode; 105 NbnsMessageQuestion *q; 106 NbnsMessageResource *an; 107 NbnsMessageResource *ns; 108 NbnsMessageResource *ar; 109 } NbnsMessage; 110 111 NbnsMessage *nbnsmessagenew(void); 112 void nbnsmessageaddquestion(NbnsMessage *s, NbnsMessageQuestion *q); 113 void nbnsmessageaddresource(NbnsMessageResource **rp, NbnsMessageResource *r); 114 NbnsMessage *nbnsconvM2S(uchar *ap, int nap); 115 void nbnsmessagefree(NbnsMessage **sp); 116 void nbnsdumpmessage(NbnsMessage *s); 117 int nbnsconvS2M(NbnsMessage *s, uchar *ap, int nap); 118 119 120 NbnsMessage *nbnsmessagenamequeryrequestnew(ushort id, int broadcast, NbName name); 121 NbnsMessage *nbnsmessagenameregistrationrequestnew(ushort id, int broadcast, NbName name, ulong ttl, uchar *ipaddr); 122 123 typedef struct NbnsTransaction NbnsTransaction; 124 125 struct NbnsTransaction { 126 ushort id; 127 Channel *c; 128 NbnsTransaction *next; 129 }; 130 ushort nbnsnextid(void); 131 132 int nbnsfindname(uchar *serveripaddr, NbName name, uchar *ipaddr, ulong *ttlp); 133 int nbnsaddname(uchar *serveripaddr, NbName name, ulong ttl, uchar *ipaddr); 134 135 NbnsTransaction *nbnstransactionnew(NbnsMessage *request, uchar *ipaddr); 136 void nbnstransactionfree(NbnsTransaction **tp); 137 138 typedef struct NbnsAlarm NbnsAlarm; 139 140 struct NbnsAlarm { 141 Channel *c; 142 vlong expirems; 143 NbnsAlarm *next; 144 }; 145 146 void nbnsalarmset(NbnsAlarm *a, ulong millisec); 147 void nbnsalarmcancel(NbnsAlarm *a); 148 void nbnsalarmfree(NbnsAlarm **ap); 149 NbnsAlarm *nbnsalarmnew(void); 150 void nbnsalarmend(void); 151 152 typedef struct NbSession NbSession; 153 typedef int NBSSWRITEFN(NbSession *s, void *buf, long n); 154 155 struct NbSession { 156 int fd; 157 void *magic; 158 NbName from; 159 NbName to; 160 }; 161 162 int nbsslisten(NbName to, NbName from, int (*accept)(void *magic, NbSession *s, NBSSWRITEFN **write), void *magic); 163 NbSession *nbssconnect(NbName to, NbName from); 164 void nbssfree(NbSession *s); 165 166 typedef struct NbScatterGather NbScatterGather; 167 168 struct NbScatterGather { 169 void *p; 170 long l; 171 }; 172 173 int nbssgatherwrite(NbSession *s, NbScatterGather *a); 174 long nbssscatterread(NbSession *, NbScatterGather *a); 175 int nbsswrite(NbSession *s, void *buf, long n); 176 long nbssread(NbSession *s, void *buf, long n); 177 void *nbemalloc(ulong); 178 179 int nbnameresolve(NbName name, uchar *ipaddr); 180 181 void nbdumpdata(void *data, long datalen); 182 183 typedef struct NbDgram { 184 uchar type; 185 uchar flags; 186 ushort id; 187 uchar srcip[IPaddrlen]; 188 ushort srcport; 189 union { 190 struct { 191 ushort length; 192 ushort offset; 193 NbName srcname; 194 NbName dstname; 195 uchar *data; 196 } datagram; 197 struct { 198 uchar code; 199 } error; 200 struct { 201 NbName dstname; 202 } query; 203 }; 204 } NbDgram; 205 206 enum { 207 NbDgramDirectUnique = 0x10, 208 NbDgramDirectGroup, 209 NbDgramBroadcast, 210 NbDgramError, 211 NbDgramQueryRequest, 212 NbDgramPositiveQueryResponse, 213 NbDgramNegativeQueryResponse, 214 NbDgramMore = 1, 215 NbDgramFirst = 2, 216 NbDgramPort = 138, 217 NbDgramErrorDestinationNameNotPresent = 0x82, 218 NbDgramMaxPacket = 576, 219 }; 220 221 typedef struct NbDgramSendParameters { 222 NbName to; 223 uchar type; 224 } NbDgramSendParameters; 225 226 int nbdgramconvM2S(NbDgram *s, uchar *p, uchar *ep); 227 int nbdgramconvS2M(uchar *p, uchar *ep, NbDgram *s); 228 void nbdgramdump(NbDgram *s); 229 int nbdgramsendto(uchar *ipaddr, ushort port, NbDgram *s); 230 int nbdgramsend(NbDgramSendParameters *p, unsigned char *data, long datalen); 231 char *nbdgramlisten(NbName to, int (*deliver)(void *magic, NbDgram *s), void *magic); 232 233 int nbnametablefind(NbName name, int add); 234 int nbnameisany(NbName name); 235 236 int nbremotenametablefind(NbName name, uchar *ipaddr); 237 int nbremotenametableadd(NbName name, uchar *ipaddr, ulong ttl); 238 239 typedef struct NbGlobals { 240 uchar myipaddr[IPaddrlen]; 241 uchar bcastaddr[IPaddrlen]; 242 NbName myname; 243 } NbGlobals; 244 245 extern NbGlobals nbglobals; 246 extern NbName nbnameany; 247 248 int nbinit(void); 249 char *nbudpannounce(ushort port, int *fdp); 250 251 extern int nbudphdrsize; 252