]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/utils: packet recycling (keeps header, doesn’t free memory)
authorMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 22 Jun 2015 00:43:52 +0000 (02:43 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 22 Jun 2015 00:43:52 +0000 (02:43 +0200)
daemon/bindings/kres.c
lib/layer/rrcache.c
lib/utils.h

index 8d2befd1ad0d395150f340d71655423f64313313..f77a304e38854718400dd554151ce19e87239370 100644 (file)
@@ -150,14 +150,9 @@ static int pkt_question(lua_State *L)
        uint8_t dname[KNOT_DNAME_MAXLEN];
        knot_dname_from_str(dname, lua_tostring(L, 2), sizeof(dname));
        if (!knot_dname_is_equal(knot_pkt_qname(pkt), dname)) {
-               uint8_t header[KNOT_WIRE_HEADER_SIZE];
-               memcpy(header, pkt->wire, sizeof(header));
-               knot_pkt_clear(pkt);
-               memcpy(pkt->wire, header, sizeof(header));
-               size_t max_size = pkt->max_size;
+               KR_PKT_RECYCLE(pkt);
                knot_pkt_put_question(pkt, dname, lua_tointeger(L, 3), lua_tointeger(L, 4));
                pkt->parsed = pkt->size;
-               pkt->max_size = max_size;
        }
        return 0;
 }
index 31247001874f45ddbc89ccbf142981275d2aa9f6..8af6e9b49f15cb4230dfaed9a42f379c85bd0960 100644 (file)
@@ -46,10 +46,7 @@ static int loot_rr(struct kr_cache_txn *txn, knot_pkt_t *pkt, const knot_dname_t
 
        /* Update packet question */
        if (!knot_dname_is_equal(knot_pkt_qname(pkt), name)) {
-               uint8_t header[KNOT_WIRE_HEADER_SIZE];
-               memcpy(header, pkt->wire, sizeof(header));
-               knot_pkt_clear(pkt);
-               memcpy(pkt->wire, header, sizeof(header));
+               KR_PKT_RECYCLE(pkt);
                knot_pkt_put_question(pkt, qry->sname, qry->sclass, qry->stype);
        }
 
index 0d2bcba8db9781e7f514ee48ec08ca36af3737fa..e26fedd763dd11e17b39dd377192041df5cefa1a 100644 (file)
@@ -34,6 +34,12 @@ extern void _cleanup_fclose(FILE **p);
  * Defines.
  */
 
+/** @internal Fast packet reset. */
+#define KR_PKT_RECYCLE(pkt) do { \
+       (pkt)->parsed = (pkt)->size = KNOT_WIRE_HEADER_SIZE; \
+       knot_pkt_parse_question((pkt)); \
+} while (0)
+
 /** Concatenate N strings. */
 char* kr_strcatdup(unsigned n, ...);