File: entity.c

package info (click to toggle)
open-isns 0.101-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,440 kB
  • sloc: ansic: 19,981; sh: 3,211; python: 1,083; perl: 839; makefile: 214
file content (127 lines) | stat: -rw-r--r-- 3,170 bytes parent folder | download | duplicates (7)
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
 * iSNS object model - network entity specific code
 *
 * Copyright (C) 2007 Olaf Kirch <olaf.kirch@oracle.com>
 */

#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <libisns/isns.h>
#include "objects.h"
#include <libisns/util.h>

/*
 * Create a network entity
 */
isns_object_t *
isns_create_entity(int protocol, const char *name)
{
	isns_object_t	*obj;

	obj = isns_create_object(&isns_entity_template, NULL, NULL);
	isns_object_set_string(obj,
			ISNS_TAG_ENTITY_IDENTIFIER,
			name);
	isns_object_set_uint32(obj,
			ISNS_TAG_ENTITY_PROTOCOL,
			protocol);

	return obj;
}

isns_object_t *
isns_create_entity_for_source(const isns_source_t *source,
		const char *eid)
{
	switch (isns_source_type(source)) {
	case ISNS_TAG_ISCSI_NAME:
		return isns_create_entity(ISNS_ENTITY_PROTOCOL_ISCSI, eid);

	case ISNS_TAG_FC_PORT_NAME_WWPN:
		return isns_create_entity(ISNS_ENTITY_PROTOCOL_IFCP, eid);
	}

	return NULL;
}

const char *
isns_entity_name(const isns_object_t *node)
{
	const isns_attr_t *attr;

	if (node->ie_attrs.ial_count == 0)
		return NULL;
	attr = node->ie_attrs.ial_data[0];
	if (attr->ia_value.iv_type != &isns_attr_type_string
	 || attr->ia_tag_id != ISNS_TAG_ENTITY_IDENTIFIER)
		return NULL;

	return attr->ia_value.iv_string;

}

int
isns_object_is_entity(const isns_object_t *obj)
{
	return ISNS_IS_ENTITY(obj);
}

/*
 * 6.2.4.  Entity Registration Timestamp
 *
 * This field indicates the most recent time when the Network Entity
 * registration occurred or when an associated object attribute was
 * updated or queried by the iSNS client registering the Network Entity.
 * The time format is, in seconds, the update period since the standard
 * base time of 00:00:00 GMT on January 1, 1970.  This field cannot be
 * explicitly registered.  This timestamp TLV format is also used in
 * the SCN and ESI messages.
 *
 * Implementer's note: we consider any kind of activity from
 * the client an indication that it is still alive.
 * Only exception is the pseudo-entity that holds the access control
 * information; we never assign it a timestamp so it is never subject
 * to expiry.
 */
void
isns_entity_touch(isns_object_t *obj)
{
	/* Do not add a timestamp to entity CONTROL */
	if (obj == NULL
	 || (obj->ie_flags & ISNS_OBJECT_PRIVATE)
	 || obj->ie_template != &isns_entity_template)
		return;
	isns_object_set_uint64(obj, ISNS_TAG_TIMESTAMP, time(NULL));
}

/*
 * Object template
 */
static uint32_t entity_attrs[] = {
	ISNS_TAG_ENTITY_IDENTIFIER,
	ISNS_TAG_ENTITY_PROTOCOL,
	ISNS_TAG_MGMT_IP_ADDRESS,
	ISNS_TAG_TIMESTAMP,
	ISNS_TAG_PROTOCOL_VERSION_RANGE,
	ISNS_TAG_REGISTRATION_PERIOD,
	ISNS_TAG_ENTITY_INDEX,
	ISNS_TAG_ENTITY_ISAKMP_PHASE_1,
	ISNS_TAG_ENTITY_CERTIFICATE,
};

static uint32_t	entity_key_attrs[] = {
	ISNS_TAG_ENTITY_IDENTIFIER,
};

isns_object_template_t		isns_entity_template = {
	.iot_name	= "Network Entity",
	.iot_handle	= ISNS_OBJECT_TYPE_ENTITY,
	.iot_attrs	= entity_attrs,
	.iot_num_attrs	= array_num_elements(entity_attrs),
	.iot_keys	= entity_key_attrs,
	.iot_num_keys	= array_num_elements(entity_key_attrs),
	.iot_index	= ISNS_TAG_ENTITY_INDEX,
	.iot_next_index	= ISNS_TAG_ENTITY_NEXT_INDEX,
};