This repository has been archived by the owner on Mar 1, 2023. It is now read-only.
forked from open-iscsi/open-isns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
entity.c
127 lines (110 loc) · 3.1 KB
/
entity.c
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
/*
* iSNS object model - network entity specific code
*
* Copyright (C) 2007 Olaf Kirch <[email protected]>
*/
#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,
};