1 #include <u.h> 2 #include <libc.h> 3 #include <ip.h> 4 #include <thread.h> 5 #include "netbios.h" 6 7 static char * 8 opname(int opcode) 9 { 10 switch (opcode) { 11 case NbnsOpQuery: return "query"; 12 case NbnsOpRegistration: return "registration"; 13 case NbnsOpRelease: return "release"; 14 case NbnsOpWack: return "wack"; 15 case NbnsOpRefresh: return "refresh"; 16 default: 17 return "???"; 18 } 19 } 20 21 void 22 nbnsdumpname(NbName name) 23 { 24 int x; 25 for (x = 0; x < NbNameLen - 1; x++) { 26 if (name[x] == ' ') 27 break; 28 print("%c", tolower(name[x])); 29 } 30 print("\\x%.2ux", name[NbNameLen - 1]); 31 } 32 33 void 34 nbnsdumpmessagequestion(NbnsMessageQuestion *q) 35 { 36 print("question: "); 37 nbnsdumpname(q->name); 38 switch (q->type) { 39 case NbnsQuestionTypeNb: print(" NB"); break; 40 case NbnsQuestionTypeNbStat: print(" NBSTAT"); break; 41 default: print(" ???"); 42 } 43 switch (q->class) { 44 case NbnsQuestionClassIn: print(" IN"); break; 45 default: print(" ???"); 46 } 47 print("\n"); 48 } 49 50 void 51 nbnsdumpmessageresource(NbnsMessageResource *r, char *name) 52 { 53 print("%s: ", name); 54 nbnsdumpname(r->name); 55 switch (r->type) { 56 case NbnsResourceTypeA: print(" A"); break; 57 case NbnsResourceTypeNs: print(" NS"); break; 58 case NbnsResourceTypeNull: print(" NULL"); break; 59 case NbnsResourceTypeNb: print(" NB"); break; 60 case NbnsResourceTypeNbStat: print(" NBSTAT"); break; 61 default: print(" ???"); 62 } 63 switch (r->class) { 64 case NbnsResourceClassIn: print(" IN"); break; 65 default: print(" ???"); 66 } 67 print(" ttl: %lud", r->ttl); 68 if (r->rdlength) { 69 int i; 70 print(" rdata: "); 71 for (i = 0; i < r->rdlength; i++) 72 print("%.2ux", r->rdata[i]); 73 } 74 print("\n"); 75 } 76 77 void 78 nbnsdumpmessage(NbnsMessage *s) 79 { 80 NbnsMessageQuestion *q; 81 NbnsMessageResource *r; 82 print("0x%.4ux %s %s (%d)", 83 s->id, opname(s->opcode), s->response ? "response" : "request", s->opcode); 84 if (s->broadcast) 85 print(" B"); 86 if (s->recursionavailable) 87 print(" RA"); 88 if (s->recursiondesired) 89 print(" RD"); 90 if (s->truncation) 91 print(" TC"); 92 if (s->authoritativeanswer) 93 print(" AA"); 94 if (s->response) 95 print(" rcode %d", s->rcode); 96 print("\n"); 97 for (q = s->q; q; q = q->next) 98 nbnsdumpmessagequestion(q); 99 for (r = s->an; r; r = r->next) 100 nbnsdumpmessageresource(r, "answer"); 101 for (r = s->ns; r; r = r->next) 102 nbnsdumpmessageresource(r, "ns"); 103 for (r = s->ar; r; r = r->next) 104 nbnsdumpmessageresource(r, "additional"); 105 } 106 107 void 108 nbdumpdata(void *ap, long n) 109 { 110 uchar *p = ap; 111 long i; 112 i = 0; 113 while (i < n) { 114 int l = n - i < 16 ? n - i : 16; 115 int b; 116 print("0x%.4lux ", i); 117 for (b = 0; b < l; b += 2) { 118 print(" %.2ux", p[i + b]); 119 if (b < l - 1) 120 print("%.2ux", p[i + b + 1]); 121 else 122 print(" "); 123 } 124 while (b < 16) { 125 print(" "); 126 b++; 127 } 128 print(" "); 129 for (b = 0; b < l; b++) 130 if (p[i + b] >= ' ' && p[i + b] <= '~') 131 print("%c", p[i + b]); 132 else 133 print("."); 134 print("\n"); 135 i += l; 136 } 137 } 138