Skip to content

Commit 95c4d64

Browse files
committed
- Speed up zone parsing (.nl reads 40% faster).
The rrtype_from_string routine is called often, optimised it. git-svn-id: file:///svn/nsd/trunk@4226 a26ef69c-88ff-0310-839f-98b793d9c207
1 parent 286fc13 commit 95c4d64

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

dns.c

+79
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,85 @@ rrtype_from_string(const char *name)
796796
long rrtype;
797797
rrtype_descriptor_type *entry;
798798

799+
/* Because this routine is called during zone parse for every record,
800+
* we optimise for frequently occuring records.
801+
* Also, we optimise for 'IN' and numbers are not rr types, because
802+
* during parse this routine is called for every rr class and TTL
803+
* to determine that it is not an RR type */
804+
switch(name[0]) {
805+
case 'r':
806+
case 'R':
807+
if(strcasecmp(name+1, "RSIG") == 0) return TYPE_RRSIG;
808+
break;
809+
case 'n':
810+
case 'N':
811+
switch(name[1]) {
812+
case 's':
813+
case 'S':
814+
switch(name[2]) {
815+
case 0: return TYPE_NS;
816+
case 'e':
817+
case 'E':
818+
if(strcasecmp(name+2, "EC") == 0) return TYPE_NSEC;
819+
if(strcasecmp(name+2, "EC3") == 0) return TYPE_NSEC3;
820+
if(strcasecmp(name+2, "EC3PARAM") == 0) return TYPE_NSEC3PARAM;
821+
break;
822+
}
823+
break;
824+
}
825+
break;
826+
case 'd':
827+
case 'D':
828+
switch(name[1]) {
829+
case 's':
830+
case 'S':
831+
if(name[2]==0) return TYPE_DS;
832+
break;
833+
case 'n':
834+
case 'N':
835+
if(strcasecmp(name+2, "SKEY") == 0) return TYPE_DNSKEY;
836+
break;
837+
}
838+
break;
839+
case 'a':
840+
case 'A':
841+
switch(name[1]) {
842+
case 0: return TYPE_A;
843+
case 'a':
844+
case 'A':
845+
if(strcasecmp(name+2, "AA") == 0) return TYPE_AAAA;
846+
break;
847+
}
848+
break;
849+
case 's':
850+
case 'S':
851+
if(strcasecmp(name+1, "OA") == 0) return TYPE_SOA;
852+
break;
853+
case 't':
854+
case 'T':
855+
if(strcasecmp(name+1, "XT") == 0) return TYPE_TXT;
856+
break;
857+
case '0':
858+
case '1':
859+
case '2':
860+
case '3':
861+
case '4':
862+
case '5':
863+
case '6':
864+
case '7':
865+
case '8':
866+
case '9':
867+
return 0; /* no RR types start with 0-9 */
868+
case 'i':
869+
case 'I':
870+
switch(name[1]) {
871+
case 'n':
872+
case 'N':
873+
return 0; /* 'IN' is a class not a type */
874+
}
875+
break;
876+
}
877+
799878
entry = rrtype_descriptor_by_name(name);
800879
if (entry) {
801880
return entry->type;

doc/ChangeLog

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
17 March 2014: Wouter
2+
- Speed up zone parsing (.nl reads 40% faster).
3+
The rrtype_from_string routine is called often, optimised it.
4+
15
14 March 2014: Wouter
26
- tag 4.0.3
37
- trunk has 4.0.4 in development.

0 commit comments

Comments
 (0)