File: msgdigest.c

package info (click to toggle)
libreswan 4.3-1%2Bdeb11u4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 62,688 kB
  • sloc: ansic: 108,293; sh: 25,973; xml: 11,756; python: 10,230; makefile: 1,580; javascript: 1,353; yacc: 825; sed: 647; perl: 584; lex: 159; awk: 156
file content (66 lines) | stat: -rw-r--r-- 2,109 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/* demultiplex incoming IKE messages
 * Copyright (C) 1997 Angelos D. Keromytis.
 * Copyright (C) 1998-2002  D. Hugh Redelmeier.
 * Copyright (C) 2019 Andrew Cagney <cagney@gnu.org>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <https://www.gnu.org/licenses/gpl2.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 *
 */

#include "defs.h"
#include "log.h"
#include "demux.h"      /* needs packet.h */
#include "iface.h"

struct msg_digest *alloc_md(const struct iface_endpoint *ifp, const ip_endpoint *sender, where_t where)
{
	/* convenient initializer:
	 * - all pointers NULL
	 * - .note = NOTHING_WRONG
	 * - .encrypted = FALSE
	 */
	struct msg_digest *md = refcnt_alloc(struct msg_digest, where);
	md->iface = ifp;
	md->sender = *sender;
	md->md_logger = alloc_logger(md, &logger_message_vec, where);
	return md;
}

struct msg_digest *clone_raw_md(struct msg_digest *md, where_t where)
{
	struct msg_digest *clone = alloc_md(md->iface, &md->sender, where);
	clone->fake_clone = true;
	clone->md_inception = threadtime_start();
	/* packet_pbs ... */
	size_t packet_size = pbs_room(&md->packet_pbs);
	void *packet_bytes = clone_bytes(md->packet_pbs.start, packet_size, "clone md");
	init_pbs(&clone->packet_pbs, packet_bytes, packet_size, "clone md");
	return clone;
}

struct msg_digest *md_addref(struct msg_digest *md, where_t where)
{
	return refcnt_addref(md, where);
}

static void free_mdp(struct msg_digest **mdp, where_t where)
{
	free_chunk_content(&(*mdp)->raw_packet);
	free_logger(&(*mdp)->md_logger, where);
	pfreeany((*mdp)->packet_pbs.start);
	pfree(*mdp);
	*mdp = NULL;
}

void md_delref(struct msg_digest **mdp, where_t where)
{
	refcnt_delref(mdp, free_mdp, where);
}