46 #if defined(ENABLE_FABRIC_EMULATION)
49 struct ocs_ns_record_s {
59 uint32_t sym_node_name_len;
60 uint32_t class_of_srvc;
64 void *__ocs_sport_femul_fabric_idle(ocs_sm_ctx_t *ctx,
ocs_sm_event_t evt,
void *arg);
65 void *__ocs_node_femul_fabric_idle(ocs_sm_ctx_t *ctx,
ocs_sm_event_t evt,
void *arg);
67 static int32_t ocs_femul_process_rft_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
68 static int32_t ocs_femul_process_gnn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
69 static int32_t ocs_femul_process_gpn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
70 static int32_t ocs_femul_process_gfpn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
71 static int32_t ocs_femul_process_gff_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
72 static int32_t ocs_femul_process_gid_ft(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
73 static int32_t ocs_femul_process_gid_pt(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
74 static int32_t ocs_femul_process_ga_nxt(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
75 static int32_t ocs_femul_process_rff_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
76 static int32_t ocs_femul_process_rpn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
77 static int32_t ocs_femul_process_rnn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
78 static int32_t ocs_femul_process_rcs_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
79 static int32_t ocs_femul_process_rsnn_nn(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
80 static int32_t ocs_femul_process_rspn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
81 static int32_t ocs_femul_process_rhba(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
82 static int32_t ocs_femul_process_rpa(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len);
84 static int32_t ocs_ns_event_add(
ocs_ns_t *ns, uint32_t port_id);
85 static void ocs_ns_event_clear(
ocs_ns_t *ns);
87 static void ocs_ns_rscn_timeout(
void *arg);
89 #define OCS_FEMUL_PORTID_BASE 0x20100
90 #define OCS_FEMUL_NUM_PORTID 256
94 uint32_t ns_record_count;
95 ocs_ns_record_t *ns_records;
96 ocs_lock_t ns_event_lock;
97 uint32_t *ns_event_list;
98 uint32_t ns_event_list_len;
99 uint32_t ns_event_list_count;
100 ocs_timer_t rscn_timer;
114 ocs_femul_portid_alloc(ocs_domain_t *domain)
116 if (domain->portid_pool == NULL) {
120 return ocs_bitmap_find(domain->portid_pool, OCS_FEMUL_NUM_PORTID) + OCS_FEMUL_PORTID_BASE;
134 ocs_femul_portid_free(ocs_domain_t *domain, int32_t portid)
136 int32_t bitnum = portid - OCS_FEMUL_PORTID_BASE;
138 ocs_assert((bitnum >= 0) && (bitnum < OCS_FEMUL_NUM_PORTID));
140 if (domain->portid_pool != NULL) {
141 ocs_bitmap_clear(domain->portid_pool, portid - OCS_FEMUL_PORTID_BASE);
157 ocs_femul_init(ocs_domain_t *domain)
160 domain->portid_pool = ocs_bitmap_alloc(OCS_FEMUL_NUM_PORTID);
162 ocs_atomic_init(&domain->femul_count, 0);
179 ocs_femul_shutdown(ocs_domain_t *domain)
181 ocs_bitmap_free(domain->portid_pool);
200 ocs_femul_process_flogi(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
202 ocs_t *ocs = io->ocs;
203 ocs_domain_t *domain = io->node->sport->domain;
205 uint64_t port_name = ocs_be64toh(((
long)flogi->
port_name_hi << 32 |
208 ocs_ns_record_t *nsrec;
215 nsrec = ocs_ns_find_port_name(domain->ocs_ns, port_name);
217 ocs_log_debug(ocs,
"Found existing NS record, send FLOGI acc\n");
223 portid = ocs_femul_portid_alloc(domain);
225 ocs_log_err(ocs,
"ocs_femul_portid_alloc() failed: %d\n", portid);
230 domain->femul_oxid = ocs_be16toh(hdr->
ox_id);
233 domain->femul_port_name = port_name;
239 if (!domain->femul_vports_started) {
240 domain->femul_vports_started = TRUE;
251 ocs_atomic_add_return(&domain->femul_count, 4);
278 ocs_femul_process_fdisc(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
280 ocs_t *ocs = io->ocs;
286 portid = ocs_femul_portid_alloc(io->node->sport->domain);
288 ocs_log_err(ocs,
"ocs_femul_portid_alloc() failed: %d\n", portid);
294 if (rspnode == NULL) {
295 ocs_log_err(ocs,
"ocs_node_alloc failed\n");
303 ocs_log_err(ocs,
"OCS_EVT_FDISC_RCVD: ocs_els_io_alloc failed\n");
326 ocs_femul_sport_attach(ocs_sport_t *sport)
328 ocs_t *ocs = sport->ocs;
329 ocs_domain_t *domain = sport->domain;
330 ocs_ns_record_t *nsrec;
338 nsrec = ocs_ns_alloc(domain->ocs_ns, sport->fc_id);
340 ocs_log_err(ocs,
"failed to allocate nsrec for fc_id 0x%x\n",
348 nsrec->node_name = sport->wwnn;
349 nsrec->port_name = sport->wwpn;
363 int32_t ocs_femul_ports_attached(ocs_domain_t *domain)
370 ocs_ns_record_t *nsrec;
376 ocs_log_debug(ocs,
"all sports attached\n");
379 if (fabric == NULL) {
380 ocs_log_warn(ocs,
"ocs_sport_find(FC_ADD_FABRIC) failed\n");
385 fc_id = ocs_femul_portid_alloc(domain);
390 ocs_log_err(ocs,
"ocs_node_alloc() failed\n");
391 ocs_femul_portid_free(domain, fc_id);
399 ocs_log_err(ocs,
"ocs_els_io_alloc() failed\n");
401 ocs_femul_portid_free(domain, fc_id);
413 nsrec = ocs_ns_alloc(domain->ocs_ns, fc_id);
415 nsrec->port_name = domain->femul_port_name;
439 ocs_femul_process_rft_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
442 ocs_ns_record_t *nsrec;
443 uint32_t port_id = ocs_be32toh(rftid->
port_id);
448 nsrec = ocs_ns_alloc(io->node->sport->domain->ocs_ns, port_id);
450 ocs_log_err(io->ocs,
"ocs_ns_alloc failed\n");
455 nsrec->fc4_types = ocs_be32toh(rftid->
fc4_types);
473 ocs_femul_process_rff_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
476 uint32_t port_id = ocs_be32toh(rffid->
port_id);
477 ocs_ns_t *ns = io->node->sport->domain->ocs_ns;
478 ocs_ns_record_t *nsrec;
480 nsrec = ocs_ns_alloc(ns, port_id);
506 ocs_femul_process_rpn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
509 uint32_t port_id = ocs_be32toh(rpnid->
port_id);
510 ocs_ns_t *ns = io->node->sport->domain->ocs_ns;
511 ocs_ns_record_t *nsrec;
513 nsrec = ocs_ns_alloc(ns, port_id);
521 nsrec->port_name = ocs_be64toh(rpnid->
port_name);
539 ocs_femul_process_rnn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
542 uint32_t port_id = ocs_be32toh(rnnid->
port_id);
543 ocs_ns_t *ns = io->node->sport->domain->ocs_ns;
544 ocs_ns_record_t *nsrec;
546 nsrec = ocs_ns_alloc(ns, port_id);
554 nsrec->node_name = ocs_be64toh(rnnid->
node_name);
572 ocs_femul_process_rcs_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
575 uint32_t port_id = ocs_be32toh(rcsid->
port_id);
576 ocs_ns_t *ns = io->node->sport->domain->ocs_ns;
577 ocs_ns_record_t *nsrec;
579 nsrec = ocs_ns_alloc(ns, port_id);
605 ocs_femul_process_rsnn_nn(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
608 uint64_t node_name = ocs_be64toh(rsnnnn->
node_name);
609 ocs_ns_t *ns = io->node->sport->domain->ocs_ns;
610 ocs_ns_record_t *nsrec;
611 ocs_t *ocs = io->ocs;
613 for (nsrec = NULL; (nsrec = ocs_ns_enumerate(ns, nsrec)) != NULL; ) {
614 if (nsrec->node_name == node_name) {
625 nsrec->sym_node_name = ocs_malloc(ocs, rsnnnn->
name_len + 1, OCS_M_ZERO | OCS_M_NOWAIT);
626 if (nsrec->sym_node_name == NULL) {
627 ocs_log_err(io->ocs,
"ocs_malloc sym_node_name failed\n");
632 nsrec->sym_node_name_len = rsnnnn->
name_len + 1;
653 ocs_femul_process_rspn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
671 ocs_femul_process_rhba(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
690 ocs_femul_process_rpa(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
709 ocs_femul_process_gnn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
714 ocs_ns_record_t *nsrec = NULL;
716 uint32_t reason_code = 0;
717 uint32_t reason_code_explanation = 0;
720 nsrec = ocs_ns_find_port_id(io->node->sport->domain->ocs_ns, port_id);
722 acc->
node_name = ocs_htobe64(nsrec->node_name);
725 ocs_log_test(io->ocs,
"port_id 0x%x not found\n", port_id);
731 reason_code, reason_code_explanation);
747 ocs_femul_process_gpn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
752 ocs_ns_record_t *nsrec = NULL;
754 uint32_t reason_code = 0;
755 uint32_t reason_code_explanation = 0;
758 nsrec = ocs_ns_find_port_id(io->node->sport->domain->ocs_ns, port_id);
760 acc->
port_name = ocs_htobe64(nsrec->port_name);
763 ocs_log_test(io->ocs,
"port_id 0x%x not found\n", port_id);
769 reason_code, reason_code_explanation);
785 ocs_femul_process_gfpn_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
804 ocs_femul_process_gff_id(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
809 ocs_ns_record_t *nsrec = NULL;
811 uint32_t reason_code = 0;
812 uint32_t reason_code_explanation = 0;
815 nsrec = ocs_ns_find_port_id(io->node->sport->domain->ocs_ns, port_id);
820 ocs_log_test(io->ocs,
"port_id 0x%x not found\n", port_id);
826 reason_code, reason_code_explanation);
842 ocs_femul_process_gid_ft(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
847 uint32_t max_entries;
848 ocs_ns_record_t *nsrec = NULL;
851 max_entries = (io->els_rsp.size -
sizeof(gidft->
hdr)) /
sizeof(uint32_t);
855 for (nsrec = ocs_ns_enumerate(io->node->sport->domain->ocs_ns, nsrec); nsrec != NULL;
856 nsrec = ocs_ns_enumerate(io->node->sport->domain->ocs_ns, nsrec)) {
858 if (idx >= max_entries) {
859 ocs_log_test(io->ocs,
"overflowed GID_FT response buffer\n");
863 if (nsrec->port_id == reqid) {
868 io->wire_len +=
sizeof(uint32_t);
890 ocs_femul_process_gid_pt(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
895 uint32_t max_entries;
896 ocs_ns_record_t *nsrec = NULL;
899 max_entries = (io->els_rsp.size -
sizeof(gidpt->
hdr)) /
sizeof(uint32_t);
903 for (nsrec = ocs_ns_enumerate(io->node->sport->domain->ocs_ns, nsrec); nsrec != NULL;
904 nsrec = ocs_ns_enumerate(io->node->sport->domain->ocs_ns, nsrec)) {
906 if (idx >= max_entries) {
907 ocs_log_test(io->ocs,
"overflowed GID_PT response buffer\n");
911 if (nsrec->port_id == reqid) {
916 io->wire_len +=
sizeof(uint32_t);
938 ocs_femul_process_ga_nxt(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
942 uint32_t port_id = ganxt_req->
port_id;
943 ocs_ns_record_t *nsrec = NULL, *tmp_nsrec = NULL;
945 ocs_memset(io->els_rsp.virt, 0,
sizeof(ganxt_resp));
946 while ((nsrec = ocs_ns_enumerate(io->node->sport->domain->ocs_ns, nsrec)) != NULL) {
947 if (nsrec->port_id > port_id) {
948 if (!tmp_nsrec || (tmp_nsrec->port_id > nsrec->port_id)) {
956 ganxt_resp->
port_id = tmp_nsrec->port_id;
957 ganxt_resp->
port_name = tmp_nsrec->port_name;
959 ocs_memcpy(ganxt_resp->
sym_node_name, tmp_nsrec->sym_node_name, MIN(tmp_nsrec->sym_node_name_len, 255));
961 ganxt_resp->
node_name = tmp_nsrec->node_name;
983 ocs_femul_process_scr(ocs_io_t *io,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
985 ocs_ns_t *ns = io->node->sport->domain->ocs_ns;
987 ocs_ns_record_t *nsrec;
989 nsrec = ocs_ns_alloc(io->node->sport->domain->ocs_ns, port_id);
992 ocs_log_test(io->ocs,
"port_id %x not found\n", port_id);
996 nsrec->scr_requested = TRUE;
997 nsrec->node = io->node;
998 ocs_log_debug(io->ocs,
"SCR accepted from %x\n", port_id);
1001 ocs_ns_event_clear(ns);
1023 ocs_femul_process_fc_gs(
const char *funcname, ocs_io_t *io,
ocs_sm_event_t evt,
fc_header_t *hdr,
void *payload, uint32_t payload_len)
1026 ocs_node_t *node = io->node;
1027 ocs_t *ocs = io->ocs;
1038 rc = ocs_femul_process_rff_id(io, hdr, payload, payload_len);
1041 rc = ocs_femul_process_gnn_id(io, hdr, payload, payload_len);
1044 rc = ocs_femul_process_gpn_id(io, hdr, payload, payload_len);
1047 rc = ocs_femul_process_gfpn_id(io, hdr, payload, payload_len);
1050 rc = ocs_femul_process_gff_id(io, hdr, payload, payload_len);
1053 rc = ocs_femul_process_gid_ft(io, hdr, payload, payload_len);
1056 rc = ocs_femul_process_gid_pt(io, hdr, payload, payload_len);
1059 rc = ocs_femul_process_ga_nxt(io, hdr, payload, payload_len);
1062 rc = ocs_femul_process_rpn_id(io, hdr, payload, payload_len);
1065 rc = ocs_femul_process_rnn_id(io, hdr, payload, payload_len);
1068 rc = ocs_femul_process_rcs_id(io, hdr, payload, payload_len);
1071 rc = ocs_femul_process_rsnn_nn(io, hdr, payload, payload_len);
1074 rc = ocs_femul_process_rspn_id(io, hdr, payload, payload_len);
1077 rc = ocs_femul_process_rft_id(io, hdr, payload, payload_len);
1080 rc = ocs_femul_process_rhba(io, hdr, payload, payload_len);
1083 rc = ocs_femul_process_rpa(io, hdr, payload, payload_len);
1086 ocs_log_test(ocs,
"[%s] (%s) %s sending CT_REJECT\n",
1107 ocs_ns_attach(ocs_domain_t *domain, uint32_t max_ports)
1110 ocs_t *ocs = domain->ocs;
1112 ns = ocs_malloc(ocs,
sizeof(*ns), OCS_M_ZERO | OCS_M_NOWAIT);
1114 ocs_log_err(ocs,
"ocs_malloc ns failed\n");
1117 ns->ns_records = ocs_malloc(ocs,
sizeof(*ns->ns_records)*max_ports, OCS_M_ZERO | OCS_M_NOWAIT);
1118 ns->ns_record_count = max_ports;
1119 if (ns->ns_records == NULL) {
1120 ocs_log_err(ocs,
"ocs_malloc ns records failed\n");
1121 ocs_free(ocs, ns,
sizeof(*ns));
1124 ocs_lock_init(ocs, &ns->ns_event_lock,
"ns_event_list lock[%d]", domain->instance_index);
1125 ns->ns_event_list_len =
sizeof(*ns->ns_event_list)*max_ports;
1126 ns->ns_event_list = ocs_malloc(ocs,
sizeof(*ns->ns_event_list)*max_ports, OCS_M_ZERO | OCS_M_NOWAIT);
1127 if (ns->ns_event_list == NULL) {
1128 ocs_log_err(ocs,
"ocs_malloc ns_event_list failed\n");
1129 ocs_free(ocs, ns->ns_records,
sizeof(*ns->ns_records)*max_ports);
1130 ocs_free(ocs, ns,
sizeof(*ns));
1133 ns->ns_event_list_count = 0;
1135 ns->domain = domain;
1152 ocs_t *ocs = ns->domain->ocs;
1153 ocs_ns_record_t *nsrec;
1155 if (ocs_timer_pending(&ns->rscn_timer)) {
1156 ocs_del_timer(&ns->rscn_timer);
1160 for (nsrec = NULL; (nsrec = ocs_ns_enumerate(ns, nsrec)) != NULL; ) {
1161 if (nsrec->sym_node_name != NULL) {
1162 ocs_free(ocs, nsrec->sym_node_name, nsrec->sym_node_name_len);
1163 nsrec->sym_node_name = NULL;
1167 if (ns->ns_records != NULL) {
1168 ocs_free(ocs, ns->ns_records,
sizeof(*ns->ns_records) * ns->ns_record_count);
1170 if (ns->ns_event_list != NULL) {
1171 ocs_free(ocs, ns->ns_event_list, ns->ns_event_list_len);
1173 ocs_lock_free(&ns->ns_event_lock);
1174 ocs_free(ocs, ns,
sizeof(*ns));
1189 ocs_ns_alloc(
ocs_ns_t *ns, uint32_t port_id)
1192 ocs_ns_record_t *nsrec;
1193 ocs_t *ocs = ns->domain->ocs;
1203 nsrec = ocs_ns_find_port_id(ns, port_id);
1204 if (nsrec != NULL) {
1209 for (i = 0, nsrec = ns->ns_records; i < ns->ns_record_count; i++, nsrec++) {
1210 if (!nsrec->active) {
1212 nsrec->port_id = port_id;
1217 if (nsrec != NULL) {
1219 ocs_ns_event_add(ns, nsrec->port_id);
1222 if (ocs_timer_pending(&ns->rscn_timer)) {
1223 ocs_del_timer(&ns->rscn_timer);
1225 ocs_setup_timer(ocs, &ns->rscn_timer, ocs_ns_rscn_timeout, ns, 1000,
false);
1241 ocs_ns_free(
ocs_ns_t *ns, uint32_t port_id)
1243 ocs_ns_record_t *nsrec;
1245 nsrec = ocs_ns_find_port_id(ns, port_id);
1246 if (nsrec != NULL) {
1247 ocs_memset(nsrec, 0,
sizeof(*ns));
1262 ocs_ns_find_port_id(
ocs_ns_t *ns, uint32_t port_id)
1265 ocs_ns_record_t *nsrec;
1267 for (i = 0, nsrec = ns->ns_records; i < ns->ns_record_count; i++, nsrec++) {
1268 if (nsrec->active && (nsrec->port_id == port_id)) {
1286 ocs_ns_find_port_name(
ocs_ns_t *ns, uint64_t port_name)
1289 ocs_ns_record_t *nsrec;
1291 for (i = 0, nsrec = ns->ns_records; i < ns->ns_record_count; i++, nsrec++) {
1292 if (nsrec->active && (nsrec->port_name == port_name)) {
1315 ocs_ns_enumerate(
ocs_ns_t *ns, ocs_ns_record_t *nsrec)
1319 if (nsrec == NULL) {
1320 nsrec = ns->ns_records;
1324 idx = nsrec - ns->ns_records;
1325 while (idx < ns->ns_record_count) {
1326 if (nsrec->active) {
1349 ocs_ns_rscn_timeout(
void *arg)
1352 ocs_t *ocs = ns->domain->ocs;
1353 ocs_ns_record_t *nsrec;
1354 uint32_t port_ids_buf_len;
1359 ocs_del_timer(&ns->rscn_timer);
1362 ocs_lock(&ns->ns_event_lock);
1363 if (ns->ns_event_list_count == 0) {
1364 ocs_unlock(&ns->ns_event_lock);
1369 port_ids_buf_len =
sizeof(*port_ids_buf) * ns->ns_event_list_count;
1370 port_ids_buf = ocs_malloc(ocs, port_ids_buf_len, OCS_M_ZERO | OCS_M_NOWAIT);
1371 if (port_ids_buf == NULL) {
1372 ocs_log_err(ocs,
"ocs_malloc port_ids failed\n");
1373 ocs_unlock(&ns->ns_event_lock);
1376 for (i = 0, pid = port_ids_buf; i < ns->ns_event_list_count; i++, pid++) {
1381 ocs_unlock(&ns->ns_event_lock);
1385 while ((nsrec = ocs_ns_enumerate(ns, nsrec)) != NULL) {
1386 if (nsrec->scr_requested) {
1388 port_ids_buf, port_ids_buf_len /
sizeof(*port_ids_buf), NULL, NULL);
1393 ocs_ns_event_clear(ns);
1395 ocs_free(ocs, port_ids_buf, port_ids_buf_len);
1409 ocs_ns_event_add(
ocs_ns_t *ns, uint32_t port_id)
1412 ocs_t *ocs = ns->domain->ocs;
1414 ocs_lock(&ns->ns_event_lock);
1416 for (i = 0; i < ns->ns_event_list_count; i++) {
1417 if (ns->ns_event_list[i] == port_id) {
1418 ocs_unlock(&ns->ns_event_lock);
1423 if (ns->ns_event_list_count >= ns->ns_record_count) {
1424 ocs_log_test(ocs,
"ns_event_list is full\n");
1425 ocs_unlock(&ns->ns_event_lock);
1429 ns->ns_event_list[ns->ns_event_list_count++] = port_id;
1430 ocs_unlock(&ns->ns_event_lock);
1447 ocs_lock(&ns->ns_event_lock);
1448 ns->ns_event_list_count = 0;
1449 ocs_unlock(&ns->ns_event_lock);
1465 ocs_ns_record_t *nsrec = NULL;
1470 if (textbuf->
ocs->domain && textbuf->
ocs->domain->femul_enable) {
1472 ocs_lock(&ns->ns_event_lock);
1473 while ((nsrec = ocs_ns_enumerate(ns, nsrec)) != NULL) {
1475 ocs_ddump_value(textbuf,
"scr_requested",
"%d", nsrec->scr_requested);
1477 ocs_ddump_value(textbuf,
"fc4_featurces",
"%02x", nsrec->fc4_features);
1480 ocs_ddump_value(textbuf,
"sym_node_name",
"%s", nsrec->sym_node_name);
1482 ocs_unlock(&ns->ns_event_lock);
ocs_sport_t * ocs_sport_find(ocs_domain_t *domain, uint32_t d_id)
Find a SLI port object, given an FC_ID.
ocs_io_t * ocs_els_io_alloc(ocs_node_t *node, uint32_t reqlen, ocs_els_role_e role)
Allocate an IO structure for an ELS IO context.
#define FC_ADDR_CONTROLLER
#define FC4_FEATURE_TARGET
#define FCCT_HDR_CMDRSP_ACCEPT
#define FCCT_COMMAND_NOT_SUPPORTED
void ocs_node_transition(ocs_node_t *node, ocs_sm_function_t state, void *data)
transition state of a node
#define FCCT_UNABLE_TO_PERFORM
void __ocs_domain_attach_internal(ocs_domain_t *domain, uint32_t s_id)
Initiator domain attach. (internal call only)
#define FC4_FEATURE_INITIATOR
uint8_t sym_node_name[255]
static uint32_t fc_htobe24(uint32_t x)
uint8_t sym_node_name_len
void ocs_ddump_section(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section start data.
void ocs_els_io_free(ocs_io_t *els)
Free IO structure for an ELS IO context.
struct fcct_gidft_acc_t::@6 port_list[1]
const char * ocs_sm_event_name(ocs_sm_event_t evt)
struct fcct_gidpt_acc_t::@7 port_list[1]
#define FCCT_DATA_BASE_FULL
#define FCCT_DEVICES_NOT_IN_COMMON_ZONE
int32_t ocs_node_free(ocs_node_t *node)
free a node structure
#define FCCT_FABRIC_PORT_NAME_NOT_REGISTERED
ocs_io_t * ocs_send_rscn(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, void *port_ids, uint32_t port_ids_count, els_cb_t cb, void *cbarg)
Send an RSCN ELS command.
int32_t ocs_sport_vport_new(ocs_domain_t *domain, uint64_t wwpn, uint64_t wwnn, uint32_t fc_id, uint8_t ini, uint8_t tgt, void *tgt_data, void *ini_data, uint8_t restore_vport)
Allocate a new virtual SLI port.
#define FCCT_CLASS_OF_SERVICE_2
ocs_io_t * ocs_send_ls_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send a generic LS_ACC response without a payload.
ocs_node_t * ocs_node_alloc(ocs_sport_t *sport, uint32_t port_id, uint8_t init, uint8_t targ)
Allocate an fc node structure and add to node list.
void ocs_ddump_endsection(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section end data.
int32_t ocs_send_ct_rsp(ocs_io_t *io, uint32_t ox_id, fcct_iu_header_t *ct_hdr, uint32_t cmd_rsp_code, uint32_t reason_code, uint32_t reason_code_explanation)
Send CT response.
ocs_io_t * ocs_send_flogi_acc(ocs_io_t *io, uint32_t ox_id, uint32_t is_fport, els_cb_t cb, void *cbarg)
#define FC_GS_TYPE_BIT(type)
#define OCS_FC_ELS_DEFAULT_RETRIES
#define FCCT_HDR_CMDRSP_REJECT
#define FC_ADDR_NAMESERVER
#define FCCT_NO_ADDITIONAL_EXPLANATION
uint32_t rscn_event_qualifier
#define node_printf(node, fmt,...)
void * __ocs_d_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Device node state machine: Initial node state for an initiator or a target.
#define ocs_assert(cond,...)
static uint32_t fc_be24toh(uint32_t x)
void ocs_ddump_value(ocs_textbuf_t *textbuf, const char *name, const char *fmt,...)
Generate driver dump data for a given value.
#define OCS_FC_ELS_SEND_DEFAULT_TIMEOUT