Working compression algo

This commit is contained in:
Miek Gieben 2012-01-10 08:52:18 +01:00
parent 1870766996
commit cedf11f27b
2 changed files with 11 additions and 5 deletions

4
msg.go
View File

@ -647,6 +647,10 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok boo
case "hex": case "hex":
// Rest of the RR is hex encoded, network order an issue here? // Rest of the RR is hex encoded, network order an issue here?
rdlength := int(val.FieldByName("Hdr").FieldByName("Rdlength").Uint()) rdlength := int(val.FieldByName("Hdr").FieldByName("Rdlength").Uint())
if off+rdlength > lenmsg {
// too large
return lenmsg, false
}
var consumed int var consumed int
switch val.Type().Name() { switch val.Type().Name() {
case "RR_DS": case "RR_DS":

View File

@ -36,12 +36,13 @@ func Compress(msg []byte) int {
// First we create a table of domain names to which we // First we create a table of domain names to which we
// can link. This is stored in 'table' // can link. This is stored in 'table'
// Once for another name the longest possible link is // Once, for another name, the longest possible link is
// found we save how we must change msg to perform this // found we save how we must change msg to perform this
// compression. This is saved in 'moves'. After we // compression. This is saved in 'moves'. After we
// traversed the entire message, we perform all the // traversed the entire message, we perform all the
// moves. // moves.
// TODO: Maybe it should be optimized. // TODO: Maybe it should be optimized.
// TODO: put this in the packRR function
// Map the labels to the offset in the message // Map the labels to the offset in the message
table := make(map[string]int) table := make(map[string]int)
@ -77,14 +78,14 @@ Loop:
//println("met lengte", len(name)+1) //println("met lengte", len(name)+1)
// the +1 for the name is for the null byte at the end // the +1 for the name is for the null byte at the end
// Discount for previous moves, reset the poffset counter // Discount for previous moves, decrease the poffset counter
// with moves that occur before it
for i := len(moves)-1; i >= 0; i-- { for i := len(moves)-1; i >= 0; i-- {
if poffset > moves[i].from { if poffset > moves[i].from {
poffset -= (moves[i].length - 2) poffset -= (moves[i].length - 2)
} }
} }
// Only need to shorten the RR when I'm shortening the rdata
// need to shorten the rdlength in the RR too!
moves = append(moves, rawmove{offset: poffset, from: moffset, length: len(name) + 1}) moves = append(moves, rawmove{offset: poffset, from: moffset, length: len(name) + 1})
} }
@ -99,7 +100,7 @@ Loop:
// In the "body" of the msg // In the "body" of the msg
off += 2 + 2 + 4 + 1 // type, class, ttl + 1 off += 2 + 2 + 4 + 1 // type, class, ttl + 1
// we are at the rdlength // we are at the rdlength
rdlength, _ := unpackUint16(msg, off) rdlength, _ := unpackUint16(msg, off)
off += int(rdlength) + 1 // Skip the rdata off += int(rdlength) + 1 // Skip the rdata
} }
off++ off++
@ -139,5 +140,6 @@ Loop:
msg[moves[i].from], msg[moves[i].from+1] = packUint16(uint16(moves[i].offset ^ 0xC000)) msg[moves[i].from], msg[moves[i].from+1] = packUint16(uint16(moves[i].offset ^ 0xC000))
saved += moves[i].length // minus something saved += moves[i].length // minus something
} }
msg = msg[:len(msg) - saved]
return saved return saved
} }