@@ -46,12 +46,14 @@ enum {
46
46
enum {
47
47
ONTAP_C2_LOG_SUPPORTED_LSP = 0x0 ,
48
48
ONTAP_C2_LOG_NSINFO_LSP = 0x1 ,
49
+ ONTAP_C2_LOG_PLATFORM_LSP = 0x2 ,
49
50
};
50
51
51
52
enum {
52
- ONTAP_VSERVER_TLV = 0x11 ,
53
- ONTAP_VOLUME_TLV = 0x12 ,
54
- ONTAP_NS_TLV = 0x13 ,
53
+ ONTAP_VSERVER_NAME_TLV = 0x11 ,
54
+ ONTAP_VOLUME_NAME_TLV = 0x12 ,
55
+ ONTAP_NS_NAME_TLV = 0x13 ,
56
+ ONTAP_NS_PATH_TLV = 0x14 ,
55
57
};
56
58
57
59
static const char * dev_path = "/dev/" ;
@@ -134,8 +136,10 @@ static void netapp_get_ontap_labels(char *vsname, char *nspath,
134
136
unsigned char * log_data )
135
137
{
136
138
int lsp , tlv , label_len ;
137
- char * vserver_name , * volume_name , * namespace_name ;
139
+ char * vserver_name , * volume_name , * namespace_name , * namespace_path ;
138
140
char vol_name [ONTAP_LABEL_LEN ], ns_name [ONTAP_LABEL_LEN ];
141
+ char ns_path [ONTAP_LABEL_LEN ];
142
+ bool nspath_tlv_available = false;
139
143
const char * ontap_vol = "/vol/" ;
140
144
int i , j ;
141
145
@@ -145,9 +149,9 @@ static void netapp_get_ontap_labels(char *vsname, char *nspath,
145
149
/* lsp not related to nsinfo */
146
150
return ;
147
151
148
- /* get the vserver tlv and name */
152
+ /* get the vserver name tlv */
149
153
tlv = * (__u8 * )& log_data [32 ];
150
- if (tlv == ONTAP_VSERVER_TLV ) {
154
+ if (tlv == ONTAP_VSERVER_NAME_TLV ) {
151
155
label_len = (* (__u16 * )& log_data [34 ]) * 4 ;
152
156
vserver_name = (char * )& log_data [36 ];
153
157
ontap_labels_to_str (vsname , vserver_name , label_len );
@@ -159,9 +163,9 @@ static void netapp_get_ontap_labels(char *vsname, char *nspath,
159
163
160
164
i = 36 + label_len ;
161
165
j = i + 2 ;
162
- /* get the volume tlv and name */
166
+ /* get the volume name tlv */
163
167
tlv = * (__u8 * )& log_data [i ];
164
- if (tlv == ONTAP_VOLUME_TLV ) {
168
+ if (tlv == ONTAP_VOLUME_NAME_TLV ) {
165
169
label_len = (* (__u16 * )& log_data [j ]) * 4 ;
166
170
volume_name = (char * )& log_data [j + 2 ];
167
171
ontap_labels_to_str (vol_name , volume_name , label_len );
@@ -173,9 +177,9 @@ static void netapp_get_ontap_labels(char *vsname, char *nspath,
173
177
174
178
i += 4 + label_len ;
175
179
j += 4 + label_len ;
176
- /* get the namespace tlv and name */
180
+ /* get the namespace name tlv */
177
181
tlv = * (__u8 * )& log_data [i ];
178
- if (tlv == ONTAP_NS_TLV ) {
182
+ if (tlv == ONTAP_NS_NAME_TLV ) {
179
183
label_len = (* (__u16 * )& log_data [j ]) * 4 ;
180
184
namespace_name = (char * )& log_data [j + 2 ];
181
185
ontap_labels_to_str (ns_name , namespace_name , label_len );
@@ -185,8 +189,25 @@ static void netapp_get_ontap_labels(char *vsname, char *nspath,
185
189
return ;
186
190
}
187
191
188
- snprintf (nspath , ONTAP_NS_PATHLEN , "%s%s%s%s" , ontap_vol ,
192
+ i += 4 + label_len ;
193
+ j += 4 + label_len ;
194
+ /* get the namespace path tlv if available */
195
+ tlv = * (__u8 * )& log_data [i ];
196
+ if (tlv == ONTAP_NS_PATH_TLV ) {
197
+ nspath_tlv_available = true;
198
+ label_len = (* (__u16 * )& log_data [j ]) * 4 ;
199
+ namespace_path = (char * )& log_data [j + 2 ];
200
+ ontap_labels_to_str (ns_path , namespace_path , label_len );
201
+ }
202
+
203
+ if (nspath_tlv_available ) {
204
+ /* set nspath from the corresponding ns_path string */
205
+ snprintf (nspath , ONTAP_NS_PATHLEN , "%s" , ns_path );
206
+ } else {
207
+ /* set nspath by concatenating ontap_vol with ns_name */
208
+ snprintf (nspath , ONTAP_NS_PATHLEN , "%s%s%s%s" , ontap_vol ,
189
209
vol_name , "/" , ns_name );
210
+ }
190
211
}
191
212
192
213
static void netapp_smdevice_json (struct json_object * devices , char * devname ,
0 commit comments