From 464144f17e75fc1e1420f1de35631f5c160538bb Mon Sep 17 00:00:00 2001
From: Jan Kadlec <jan.kadlec@nic.cz>
Date: Thu, 3 Apr 2014 17:32:25 +0200
Subject: [PATCH] new_node: Access knot_rr_t array using packed structure.

 - todo: Find file with __i386__ define or something similar
 - removed contst getter for rr rdata.
 - reused knot_rr_array_size function for size + META_SIZE like formulas
---
 src/knot/zone/node.h |  5 ----
 src/libknot/rdata.h  |  4 ++--
 src/libknot/rr.c     | 55 +++++++++++++++++++++++---------------------
 src/libknot/rr.h     |  9 +-------
 src/libknot/rrset.c  |  4 ++--
 5 files changed, 34 insertions(+), 43 deletions(-)

diff --git a/src/knot/zone/node.h b/src/knot/zone/node.h
index e53d70821..f491d8140 100644
--- a/src/knot/zone/node.h
+++ b/src/knot/zone/node.h
@@ -33,11 +33,6 @@
 #include "libknot/rrset.h"
 #include "libknot/rr.h"
 
-/*! \brief RRSet count in node if there is only NSEC (and possibly its RRSIG).*/
-#define KNOT_NODE_RRSET_COUNT_ONLY_NSEC 2
-
-/*----------------------------------------------------------------------------*/
-
 struct rr_data;
 
 /*!
diff --git a/src/libknot/rdata.h b/src/libknot/rdata.h
index 1519b19a6..5dadc12b5 100644
--- a/src/libknot/rdata.h
+++ b/src/libknot/rdata.h
@@ -43,7 +43,7 @@
 static inline uint8_t *data_offset(const knot_rrs_t *rrs, size_t pos,
                                    size_t offset) {
 	knot_rr_t *rr = knot_rrs_get_rr(rrs, pos);
-	return knot_rr_get_rdata(rr) + offset;
+	return knot_rr_rdata(rr) + offset;
 }
 
 static inline
@@ -259,7 +259,7 @@ void knot_rrs_nsec_bitmap(const knot_rrs_t *rrs,
 	knot_rr_t *rr = knot_rrs_get_rr(rrs, 0);
 	int next_size = knot_dname_size(knot_rrs_nsec_next(rrs));
 
-	*bitmap = knot_rr_get_rdata(rr) + next_size;
+	*bitmap = knot_rr_rdata(rr) + next_size;
 	*size = knot_rr_size(rr) - next_size;
 }
 
diff --git a/src/libknot/rr.c b/src/libknot/rr.c
index 996c1753c..0ce6bb28f 100644
--- a/src/libknot/rr.c
+++ b/src/libknot/rr.c
@@ -17,16 +17,24 @@
 #include <assert.h>
 #include <string.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 #include "libknot/rr.h"
 #include "libknot/rdata.h"
 #include "libknot/common.h"
 #include "common/errcode.h"
 
-// __i386__
+#pragma pack(push, 1)
 
-/*!< \brief RR metadata size. */
-static const size_t RR_META_SIZE = sizeof(uint16_t) + sizeof(uint32_t);
+struct rr_offsets {
+	uint32_t ttl;
+	uint16_t size;
+	uint8_t rdata[];
+};
+
+#pragma pack(pop)
+
+#warning "missing #ifdefs for #pragma once, couldn't find the right define"
 
 static knot_rr_t *rr_seek(knot_rr_t *d, size_t pos)
 {
@@ -37,7 +45,7 @@ static knot_rr_t *rr_seek(knot_rr_t *d, size_t pos)
 	size_t offset = 0;
 	for (size_t i = 0; i < pos; i++) {
 		knot_rr_t *rr = d + offset;
-		offset += knot_rr_size(rr) + RR_META_SIZE;
+		offset += knot_rr_array_size(knot_rr_size(rr));
 	}
 
 	return d + offset;
@@ -53,7 +61,7 @@ static size_t knot_rrs_size(const knot_rrs_t *rrs)
 	for (size_t i = 0; i < rrs->rr_count; ++i) {
 		const knot_rr_t *rr = knot_rrs_rr(rrs, i);
 		assert(rr);
-		total_size += knot_rr_size(rr) + RR_META_SIZE;
+		total_size += knot_rr_array_size(knot_rr_size(rr));
 	}
 
 	return total_size;
@@ -71,7 +79,7 @@ static uint8_t* knot_rrs_create_rr_at_pos(knot_rrs_t *rrs,
 
 	// Realloc data.
 	void *tmp = mm_realloc(mm, rrs->data,
-	                       total_size + size + RR_META_SIZE,
+	                       total_size + knot_rr_array_size(size),
 	                       total_size);
 	if (tmp) {
 		rrs->data = tmp;
@@ -87,7 +95,7 @@ static uint8_t* knot_rrs_create_rr_at_pos(knot_rrs_t *rrs,
 		knot_rr_t *new_rr = knot_rrs_get_rr(rrs, pos);
 		knot_rr_set_size(new_rr, size);
 		knot_rr_set_ttl(new_rr, ttl);
-		return knot_rr_get_rdata(new_rr);
+		return knot_rr_rdata(new_rr);
 	}
 
 	knot_rr_t *last_rr = knot_rrs_get_rr(rrs, rrs->rr_count - 1);
@@ -98,15 +106,15 @@ static uint8_t* knot_rrs_create_rr_at_pos(knot_rrs_t *rrs,
 		knot_rr_t *new_rr = knot_rrs_get_rr(rrs, pos);
 		knot_rr_set_size(new_rr, size);
 		knot_rr_set_ttl(new_rr, ttl);
-		return knot_rr_get_rdata(new_rr);
+		return knot_rr_rdata(new_rr);
 	}
 
 	knot_rr_t *old_rr = knot_rrs_get_rr(rrs, pos);
 	assert(old_rr);
 
 	// Make space for new data by moving the array
-	memmove(old_rr + size + RR_META_SIZE, old_rr,
-	        (last_rr + RR_META_SIZE + knot_rr_size(last_rr)) - old_rr);
+	memmove(old_rr + knot_rr_array_size(size), old_rr,
+	        (last_rr + knot_rr_array_size(knot_rr_size(last_rr))) - old_rr);
 
 	// Set size for new RR
 	knot_rr_set_size(old_rr, size);
@@ -114,7 +122,7 @@ static uint8_t* knot_rrs_create_rr_at_pos(knot_rrs_t *rrs,
 
 	rrs->rr_count++;
 	assert(knot_rr_size(old_rr) > 0);
-	return knot_rr_get_rdata(old_rr);
+	return knot_rr_rdata(old_rr);
 }
 
 static int knot_rrs_add_rr_at_pos(knot_rrs_t *rrs, const knot_rr_t *rr,
@@ -138,37 +146,32 @@ static int knot_rrs_add_rr_at_pos(knot_rrs_t *rrs, const knot_rr_t *rr,
 
 uint16_t knot_rr_size(const knot_rr_t *rr)
 {
-	return *((uint16_t *)rr);
+	return ((struct rr_offsets *)rr)->size;
 }
 
 void knot_rr_set_size(knot_rr_t *rr, uint16_t size)
 {
-	*((uint16_t *)rr) = size;
+	((struct rr_offsets *)rr)->size = size;
 }
 
 uint32_t knot_rr_ttl(const knot_rr_t *rr)
 {
-	return *((uint32_t *)(rr + sizeof(uint16_t)));
+	return ((struct rr_offsets *)rr)->ttl;
 }
 
 void knot_rr_set_ttl(knot_rr_t *rr, uint32_t ttl)
 {
-	*((uint32_t *)(rr + sizeof(uint16_t))) = ttl;
-}
-
-const uint8_t *knot_rr_rdata(const knot_rr_t *rr)
-{
-	return (const uint8_t *)(rr + RR_META_SIZE);
+	((struct rr_offsets *)rr)->ttl = ttl;
 }
 
-uint8_t *knot_rr_get_rdata(knot_rr_t *rr)
+uint8_t *knot_rr_rdata(const knot_rr_t *rr)
 {
-	return rr + RR_META_SIZE;
+	return ((struct rr_offsets *)rr)->rdata;
 }
 
 size_t knot_rr_array_size(uint16_t size)
 {
-	return size + RR_META_SIZE;
+	return size + sizeof(struct rr_offsets);
 }
 
 int knot_rr_cmp(const knot_rr_t *rr1, const knot_rr_t *rr2)
@@ -308,8 +311,8 @@ int knot_rrs_remove_rr_at_pos(knot_rrs_t *rrs, size_t pos, mm_ctx_t *mm)
 	size_t total_size = knot_rrs_size(rrs);
 	uint16_t old_size = knot_rr_size(old_rr);
 
-	void *old_threshold = old_rr + old_size + RR_META_SIZE;
-	void *last_threshold = last_rr + knot_rr_size(last_rr) + RR_META_SIZE;
+	void *old_threshold = old_rr + knot_rr_array_size(old_size);
+	void *last_threshold = last_rr + knot_rr_array_size(knot_rr_size(last_rr));
 	// Move RDATA
 	memmove(old_rr, old_threshold,
 	        last_threshold - old_threshold);
@@ -317,7 +320,7 @@ int knot_rrs_remove_rr_at_pos(knot_rrs_t *rrs, size_t pos, mm_ctx_t *mm)
 	if (rrs->rr_count > 1) {
 		// Realloc RDATA
 		void *tmp = mm_realloc(mm, rrs->data,
-		                       total_size - (old_size + RR_META_SIZE),
+		                       total_size - (knot_rr_array_size(old_size)),
 		                       total_size);
 		if (tmp == NULL) {
 			ERR_ALLOC_FAILED;
diff --git a/src/libknot/rr.h b/src/libknot/rr.h
index f9b6890bd..477777fa9 100644
--- a/src/libknot/rr.h
+++ b/src/libknot/rr.h
@@ -66,19 +66,12 @@ uint32_t knot_rr_ttl(const knot_rr_t *rr);
  */
 void knot_rr_set_ttl(knot_rr_t *rr, uint32_t ttl);
 
-/*!
- * \brief Returns const pointer to RR data.
- * \param rr  RR whose data we want.
- * \return RR data const pointer.
- */
-const uint8_t *knot_rr_rdata(const knot_rr_t *rr);
-
 /*!
  * \brief Returns pointer to RR data.
  * \param rr  RR whose data we want.
  * \return RR data pointer.
  */
-uint8_t *knot_rr_get_rdata(knot_rr_t *rr);
+uint8_t *knot_rr_rdata(const knot_rr_t *rr);
 
 /* ----------------------------- RR misc ------------------------------------ */
 
diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c
index 02afda8f6..265e61396 100644
--- a/src/libknot/rrset.c
+++ b/src/libknot/rrset.c
@@ -467,7 +467,7 @@ int knot_rrset_add_rr(knot_rrset_t *rrset,
 	knot_rr_t rr[knot_rr_array_size(size)];
 	knot_rr_set_size(rr, size);
 	knot_rr_set_ttl(rr, ttl);
-	memcpy(knot_rr_get_rdata(rr), rdata, size);
+	memcpy(knot_rr_rdata(rr), rdata, size);
 
 	return knot_rrs_add_rr(&rrset->rrs, rr, mm);
 }
@@ -504,7 +504,7 @@ uint8_t *knot_rrset_rr_rdata(const knot_rrset_t *rrset, size_t pos)
 {
 	knot_rr_t *rr = knot_rrs_get_rr(&rrset->rrs, pos);
 	if (rr) {
-		return knot_rr_get_rdata(rr);
+		return knot_rr_rdata(rr);
 	} else {
 		return NULL;
 	}
-- 
GitLab