Lines Matching +full:user +full:- +full:challenge
22 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
78 #define IPMI_LAN_MAX_REQUEST_SIZE 38 /* 45 - 7 */
79 #define IPMI_LAN_MAX_RESPONSE_SIZE 34 /* 42 - 8 */
133 memcpy(&e->req, req, sizeof(struct ipmi_rq)); in ipmi_req_add_entry()
135 e->intf = intf; in ipmi_req_add_entry()
136 e->rq_seq = req_seq; in ipmi_req_add_entry()
141 ipmi_req_entries_tail->next = e; in ipmi_req_add_entry()
145 e->rq_seq, e->req.msg.cmd); in ipmi_req_add_entry()
153 while (e && (e->rq_seq != seq || e->req.msg.cmd != cmd)) { in ipmi_req_lookup_entry()
154 if (e->next == NULL || e == e->next) in ipmi_req_lookup_entry()
156 e = e->next; in ipmi_req_lookup_entry()
168 while (e && (e->rq_seq != seq || e->req.msg.cmd != cmd)) { in ipmi_req_remove_entry()
170 e = e->next; in ipmi_req_remove_entry()
175 saved_next_entry = e->next; in ipmi_req_remove_entry()
176 p->next = (p->next == e->next) ? NULL : e->next; in ipmi_req_remove_entry()
191 if (e->msg_data) { in ipmi_req_remove_entry()
192 free(e->msg_data); in ipmi_req_remove_entry()
193 e->msg_data = NULL; in ipmi_req_remove_entry()
208 e->rq_seq, e->req.msg.cmd); in ipmi_req_clear_entries()
209 if (e->next != NULL) { in ipmi_req_clear_entries()
210 p = e->next; in ipmi_req_clear_entries()
248 return send(intf->fd, data, data_len, 0); in ipmi_lan_send_packet()
261 FD_SET(intf->fd, &read_set); in ipmi_lan_recv_packet()
264 FD_SET(intf->fd, &err_set); in ipmi_lan_recv_packet()
266 tmout.tv_sec = intf->ssn_params.timeout; in ipmi_lan_recv_packet()
269 ret = select(intf->fd + 1, &read_set, NULL, &err_set, &tmout); in ipmi_lan_recv_packet()
270 if (ret < 0 || FD_ISSET(intf->fd, &err_set) || !FD_ISSET(intf->fd, &read_set)) in ipmi_lan_recv_packet()
274 * packet--sent to UDP port 623--will be processed by both the in ipmi_lan_recv_packet()
283 ret = recv(intf->fd, &rsp.data, IPMI_BUF_SIZE, 0); in ipmi_lan_recv_packet()
287 FD_SET(intf->fd, &read_set); in ipmi_lan_recv_packet()
290 FD_SET(intf->fd, &err_set); in ipmi_lan_recv_packet()
292 tmout.tv_sec = intf->ssn_params.timeout; in ipmi_lan_recv_packet()
295 ret = select(intf->fd + 1, &read_set, NULL, &err_set, &tmout); in ipmi_lan_recv_packet()
296 if (ret < 0 || FD_ISSET(intf->fd, &err_set) || !FD_ISSET(intf->fd, &read_set)) in ipmi_lan_recv_packet()
299 ret = recv(intf->fd, &rsp.data, IPMI_BUF_SIZE, 0); in ipmi_lan_recv_packet()
319 * return -1 if ping response not received
324 * udp.dest = ? // udp.source from rmcp-ping
333 * asf.tag = ? // asf.tag from rmcp-ping
337 * asf.data[7:4]= 0x00000000 // OEM-defined (not for IPMI)
349 return -1; in ipmi_handle_pong()
351 pong = (struct rmcp_pong *)rsp->data; in ipmi_handle_pong()
360 (pong->sup_entities & 0x80) ? "" : " NOT", in ipmi_handle_pong()
361 (pong->sup_entities & 0x01) ? "1.0" : "unknown", in ipmi_handle_pong()
362 (pong->rmcp.ver == 6) ? "1.0" : "unknown", in ipmi_handle_pong()
363 pong->rmcp.seq, in ipmi_handle_pong()
364 ntohl(pong->iana)); in ipmi_handle_pong()
366 return (pong->sup_entities & 0x80) ? 1 : 0; in ipmi_handle_pong()
407 return -1; in ipmi_lan_ping()
422 return -1; in ipmi_lan_ping()
433 * request message. This may kick-start some BMCs that get confused with
459 uint8_t our_address = intf->my_addr; in ipmi_lan_poll_recv()
469 memcpy(&rmcp_rsp, rsp->data, 4); in ipmi_lan_poll_recv()
487 rsp->session.authtype = rsp->data[x++]; in ipmi_lan_poll_recv()
488 memcpy(&rsp->session.seq, rsp->data+x, 4); in ipmi_lan_poll_recv()
490 memcpy(&rsp->session.id, rsp->data+x, 4); in ipmi_lan_poll_recv()
493 if (rsp->session.id == (intf->session->session_id + 0x10000000)) { in ipmi_lan_poll_recv()
495 rsp->session.payloadtype = IPMI_PAYLOAD_TYPE_SOL; in ipmi_lan_poll_recv()
497 rsp->session.msglen = rsp->data[x++]; in ipmi_lan_poll_recv()
499 rsp->payload.sol_packet.packet_sequence_number = in ipmi_lan_poll_recv()
500 rsp->data[x++] & 0x0F; in ipmi_lan_poll_recv()
502 rsp->payload.sol_packet.acked_packet_number = in ipmi_lan_poll_recv()
503 rsp->data[x++] & 0x0F; in ipmi_lan_poll_recv()
505 rsp->payload.sol_packet.accepted_character_count = in ipmi_lan_poll_recv()
506 rsp->data[x++]; in ipmi_lan_poll_recv()
508 rsp->payload.sol_packet.is_nack = in ipmi_lan_poll_recv()
509 rsp->data[x] & 0x40; in ipmi_lan_poll_recv()
511 rsp->payload.sol_packet.transfer_unavailable = in ipmi_lan_poll_recv()
512 rsp->data[x] & 0x20; in ipmi_lan_poll_recv()
514 rsp->payload.sol_packet.sol_inactive = in ipmi_lan_poll_recv()
515 rsp->data[x] & 0x10; in ipmi_lan_poll_recv()
517 rsp->payload.sol_packet.transmit_overrun = in ipmi_lan_poll_recv()
518 rsp->data[x] & 0x08; in ipmi_lan_poll_recv()
520 rsp->payload.sol_packet.break_detected = in ipmi_lan_poll_recv()
521 rsp->data[x++] & 0x04; in ipmi_lan_poll_recv()
526 rsp->payload.sol_packet.packet_sequence_number); in ipmi_lan_poll_recv()
529 rsp->payload.sol_packet.acked_packet_number); in ipmi_lan_poll_recv()
532 rsp->payload.sol_packet.accepted_character_count); in ipmi_lan_poll_recv()
535 rsp->payload.sol_packet.is_nack? "true" : "false"); in ipmi_lan_poll_recv()
538 rsp->payload.sol_packet.transfer_unavailable? "true" : "false"); in ipmi_lan_poll_recv()
541 rsp->payload.sol_packet.sol_inactive? "true" : "false"); in ipmi_lan_poll_recv()
544 rsp->payload.sol_packet.transmit_overrun? "true" : "false"); in ipmi_lan_poll_recv()
547 rsp->payload.sol_packet.break_detected? "true" : "false"); in ipmi_lan_poll_recv()
552 rsp->session.payloadtype = IPMI_PAYLOAD_TYPE_IPMI; in ipmi_lan_poll_recv()
553 if (intf->session->active && (rsp->session.authtype || intf->session->authtype)) in ipmi_lan_poll_recv()
556 rsp->session.msglen = rsp->data[x++]; in ipmi_lan_poll_recv()
557 rsp->payload.ipmi_response.rq_addr = rsp->data[x++]; in ipmi_lan_poll_recv()
558 rsp->payload.ipmi_response.netfn = rsp->data[x] >> 2; in ipmi_lan_poll_recv()
559 rsp->payload.ipmi_response.rq_lun = rsp->data[x++] & 0x3; in ipmi_lan_poll_recv()
561 rsp->payload.ipmi_response.rs_addr = rsp->data[x++]; in ipmi_lan_poll_recv()
562 rsp->payload.ipmi_response.rq_seq = rsp->data[x] >> 2; in ipmi_lan_poll_recv()
563 rsp->payload.ipmi_response.rs_lun = rsp->data[x++] & 0x3; in ipmi_lan_poll_recv()
564 rsp->payload.ipmi_response.cmd = rsp->data[x++]; in ipmi_lan_poll_recv()
565 rsp->ccode = rsp->data[x++]; in ipmi_lan_poll_recv()
568 printbuf(rsp->data, rsp->data_len, "ipmi message header"); in ipmi_lan_poll_recv()
572 val2str(rsp->session.authtype, ipmi_authtype_session_vals)); in ipmi_lan_poll_recv()
574 (long)rsp->session.seq); in ipmi_lan_poll_recv()
576 (long)rsp->session.id); in ipmi_lan_poll_recv()
579 rsp->payload.ipmi_response.rq_addr); in ipmi_lan_poll_recv()
581 rsp->payload.ipmi_response.netfn); in ipmi_lan_poll_recv()
583 rsp->payload.ipmi_response.rq_lun); in ipmi_lan_poll_recv()
585 rsp->payload.ipmi_response.rs_addr); in ipmi_lan_poll_recv()
587 rsp->payload.ipmi_response.rq_seq); in ipmi_lan_poll_recv()
589 rsp->payload.ipmi_response.rs_lun); in ipmi_lan_poll_recv()
591 rsp->payload.ipmi_response.cmd); in ipmi_lan_poll_recv()
593 rsp->ccode); in ipmi_lan_poll_recv()
596 entry = ipmi_req_lookup_entry(rsp->payload.ipmi_response.rq_seq, in ipmi_lan_poll_recv()
597 rsp->payload.ipmi_response.cmd); in ipmi_lan_poll_recv()
600 if ((intf->target_addr != our_address) && bridge_possible) { in ipmi_lan_poll_recv()
601 if ((rsp->data_len) && (rsp->payload.ipmi_response.netfn == 7) && in ipmi_lan_poll_recv()
602 (rsp->payload.ipmi_response.cmd != 0x34)) { in ipmi_lan_poll_recv()
604 printbuf(&rsp->data[x], rsp->data_len-x, in ipmi_lan_poll_recv()
608 if (entry->bridging_level && in ipmi_lan_poll_recv()
609 rsp->payload.ipmi_response.netfn == 7 && in ipmi_lan_poll_recv()
610 rsp->payload.ipmi_response.cmd == 0x34) { in ipmi_lan_poll_recv()
611 entry->bridging_level--; in ipmi_lan_poll_recv()
612 if (rsp->data_len - x - 1 == 0) { in ipmi_lan_poll_recv()
613 rsp = !rsp->ccode ? ipmi_lan_recv_packet(intf) : NULL; in ipmi_lan_poll_recv()
614 if (!entry->bridging_level) in ipmi_lan_poll_recv()
615 entry->req.msg.cmd = entry->req.msg.target_cmd; in ipmi_lan_poll_recv()
617 ipmi_req_remove_entry(entry->rq_seq, entry->req.msg.cmd); in ipmi_lan_poll_recv()
622 memmove(rsp->data + x - 7, in ipmi_lan_poll_recv()
623 rsp->data + x, in ipmi_lan_poll_recv()
624 rsp->data_len - x - 1); in ipmi_lan_poll_recv()
625 rsp->data[x - 8] -= 8; in ipmi_lan_poll_recv()
626 rsp->data_len -= 8; in ipmi_lan_poll_recv()
627 entry->rq_seq = rsp->data[x - 3] >> 2; in ipmi_lan_poll_recv()
628 if (!entry->bridging_level) in ipmi_lan_poll_recv()
629 entry->req.msg.cmd = entry->req.msg.target_cmd; in ipmi_lan_poll_recv()
633 //x += sizeof(rsp->payload.ipmi_response); in ipmi_lan_poll_recv()
634 if (rsp->data[x-1] != 0) in ipmi_lan_poll_recv()
637 rsp->data[x-1]); in ipmi_lan_poll_recv()
640 ipmi_req_remove_entry(rsp->payload.ipmi_response.rq_seq, in ipmi_lan_poll_recv()
641 rsp->payload.ipmi_response.cmd); in ipmi_lan_poll_recv()
653 if (rsp && rsp->data_len > x) { in ipmi_lan_poll_recv()
654 rsp->data_len -= x; in ipmi_lan_poll_recv()
655 if (rsp->session.payloadtype == IPMI_PAYLOAD_TYPE_IPMI) in ipmi_lan_poll_recv()
656 rsp->data_len -= 1; /* We don't want the checksum */ in ipmi_lan_poll_recv()
657 memmove(rsp->data, rsp->data + x, rsp->data_len); in ipmi_lan_poll_recv()
658 memset(rsp->data + rsp->data_len, 0, IPMI_BUF_SIZE - rsp->data_len); in ipmi_lan_poll_recv()
666 * +--------------------+
671 * +--------------------+
675 * +--------------------+
677 * +--------------------+
679 * +--------------------+
686 * +--------------------+
688 * +--------------------+
690 * +--------------------+
706 struct ipmi_session * s = intf->session; in ipmi_lan_build_cmd()
708 uint8_t our_address = intf->my_addr; in ipmi_lan_build_cmd()
722 // the seq number we have to re-use the node which has existing in ipmi_lan_build_cmd()
725 entry = ipmi_req_lookup_entry(curr_seq, req->msg.cmd); in ipmi_lan_build_cmd()
729 // No need to add once again and we will re-use the existing node. in ipmi_lan_build_cmd()
732 if (entry->msg_data) { in ipmi_lan_build_cmd()
733 free(entry->msg_data); in ipmi_lan_build_cmd()
734 entry->msg_data = NULL; in ipmi_lan_build_cmd()
746 len = req->msg.data_len + 29; in ipmi_lan_build_cmd()
747 if (s->active && s->authtype) in ipmi_lan_build_cmd()
749 if (intf->transit_addr != intf->my_addr && intf->transit_addr != 0) in ipmi_lan_build_cmd()
763 msg[len++] = s->active ? s->authtype : 0; in ipmi_lan_build_cmd()
765 msg[len++] = s->in_seq & 0xff; in ipmi_lan_build_cmd()
766 msg[len++] = (s->in_seq >> 8) & 0xff; in ipmi_lan_build_cmd()
767 msg[len++] = (s->in_seq >> 16) & 0xff; in ipmi_lan_build_cmd()
768 msg[len++] = (s->in_seq >> 24) & 0xff; in ipmi_lan_build_cmd()
769 memcpy(msg+len, &s->session_id, 4); in ipmi_lan_build_cmd()
773 if (s->active && s->authtype) { in ipmi_lan_build_cmd()
775 memcpy(msg+len, s->authcode, 16); in ipmi_lan_build_cmd()
780 if ((intf->target_addr == our_address) || !bridge_possible) { in ipmi_lan_build_cmd()
781 entry->bridging_level = 0; in ipmi_lan_build_cmd()
782 msg[len++] = req->msg.data_len + 7; in ipmi_lan_build_cmd()
786 entry->bridging_level = 1; in ipmi_lan_build_cmd()
787 msg[len++] = req->msg.data_len + 15 + in ipmi_lan_build_cmd()
788 (intf->transit_addr != intf->my_addr && intf->transit_addr != 0 ? 8 : 0); in ipmi_lan_build_cmd()
792 tmp = len - cs; in ipmi_lan_build_cmd()
798 entry->req.msg.target_cmd = entry->req.msg.cmd; /* Save target command */ in ipmi_lan_build_cmd()
799 entry->req.msg.cmd = 0x34; /* (fixup request entry) */ in ipmi_lan_build_cmd()
801 if (intf->transit_addr == intf->my_addr || intf->transit_addr == 0) { in ipmi_lan_build_cmd()
802 msg[len++] = (0x40|intf->target_channel); /* Track request*/ in ipmi_lan_build_cmd()
804 entry->bridging_level++; in ipmi_lan_build_cmd()
805 msg[len++] = (0x40|intf->transit_channel); /* Track request*/ in ipmi_lan_build_cmd()
807 msg[len++] = intf->transit_addr; in ipmi_lan_build_cmd()
809 tmp = len - cs; in ipmi_lan_build_cmd()
812 msg[len++] = intf->my_addr; in ipmi_lan_build_cmd()
815 msg[len++] = (0x40|intf->target_channel); /* Track request */ in ipmi_lan_build_cmd()
821 msg[len++] = entry->bridging_level ? intf->target_addr : IPMI_BMC_SLAVE_ADDR; in ipmi_lan_build_cmd()
822 msg[len++] = req->msg.netfn << 2 | (req->msg.lun & 3); in ipmi_lan_build_cmd()
823 tmp = len - cs; in ipmi_lan_build_cmd()
827 if (!entry->bridging_level) in ipmi_lan_build_cmd()
830 else if (entry->bridging_level) in ipmi_lan_build_cmd()
831 msg[len++] = intf->my_addr; in ipmi_lan_build_cmd()
833 entry->rq_seq = curr_seq; in ipmi_lan_build_cmd()
834 msg[len++] = entry->rq_seq << 2; in ipmi_lan_build_cmd()
835 msg[len++] = req->msg.cmd; in ipmi_lan_build_cmd()
837 lprintf(LOG_DEBUG+1, ">> IPMI Request Session Header (level %d)", entry->bridging_level); in ipmi_lan_build_cmd()
839 val2str(s->authtype, ipmi_authtype_session_vals)); in ipmi_lan_build_cmd()
840 lprintf(LOG_DEBUG+1, ">> Sequence : 0x%08lx", (long)s->in_seq); in ipmi_lan_build_cmd()
841 lprintf(LOG_DEBUG+1, ">> Session ID : 0x%08lx", (long)s->session_id); in ipmi_lan_build_cmd()
843 lprintf(LOG_DEBUG+1, ">> Rs Addr : %02x", intf->target_addr); in ipmi_lan_build_cmd()
844 lprintf(LOG_DEBUG+1, ">> NetFn : %02x", req->msg.netfn); in ipmi_lan_build_cmd()
847 lprintf(LOG_DEBUG+1, ">> Rq Seq : %02x", entry->rq_seq); in ipmi_lan_build_cmd()
849 lprintf(LOG_DEBUG+1, ">> Command : %02x", req->msg.cmd); in ipmi_lan_build_cmd()
852 if (req->msg.data_len) { in ipmi_lan_build_cmd()
853 memcpy(msg+len, req->msg.data, req->msg.data_len); in ipmi_lan_build_cmd()
854 len += req->msg.data_len; in ipmi_lan_build_cmd()
858 tmp = len - cs; in ipmi_lan_build_cmd()
862 if (entry->bridging_level) { in ipmi_lan_build_cmd()
863 if (intf->transit_addr != intf->my_addr && intf->transit_addr != 0) { in ipmi_lan_build_cmd()
864 tmp = len - cs3; in ipmi_lan_build_cmd()
867 tmp = len - cs2; in ipmi_lan_build_cmd()
871 if (s->active) { in ipmi_lan_build_cmd()
873 * s->authcode is already copied to msg+ap but some in ipmi_lan_build_cmd()
877 switch (s->authtype) { in ipmi_lan_build_cmd()
879 temp = ipmi_auth_md5(s, msg+mp, msg[mp-1]); in ipmi_lan_build_cmd()
883 temp = ipmi_auth_md2(s, msg+mp, msg[mp-1]); in ipmi_lan_build_cmd()
889 if (s->in_seq) { in ipmi_lan_build_cmd()
890 s->in_seq++; in ipmi_lan_build_cmd()
891 if (s->in_seq == 0) in ipmi_lan_build_cmd()
892 s->in_seq++; in ipmi_lan_build_cmd()
895 entry->msg_len = len; in ipmi_lan_build_cmd()
896 entry->msg_data = msg; in ipmi_lan_build_cmd()
910 intf->opened, intf->open); in ipmi_lan_send_cmd()
912 if (intf->opened == 0 && intf->open != NULL) { in ipmi_lan_send_cmd()
913 if (intf->open(intf) < 0) { in ipmi_lan_send_cmd()
918 intf->opened, intf->open); in ipmi_lan_send_cmd()
930 if (ipmi_lan_send_packet(intf, entry->msg_data, entry->msg_len) < 0) { in ipmi_lan_send_cmd()
933 ipmi_req_remove_entry(entry->rq_seq, entry->req.msg.target_cmd); in ipmi_lan_send_cmd()
938 if (intf->noanswer) in ipmi_lan_send_cmd()
950 if((rsp != NULL) && (rsp->ccode == 0xcf)) { in ipmi_lan_send_cmd()
959 if (++try >= intf->ssn_params.retry) { in ipmi_lan_send_cmd()
979 // [23, 10] --> BMC in ipmi_lan_send_cmd()
980 // [23, 10] --> BMC in ipmi_lan_send_cmd()
981 // [23, 10] --> BMC in ipmi_lan_send_cmd()
982 // [23, 10] --> BMC in ipmi_lan_send_cmd()
983 // [2D, 11] --> BMC in ipmi_lan_send_cmd()
984 // <-- [23, 10] in ipmi_lan_send_cmd()
1000 struct ipmi_session * s = intf->session; in ipmi_lan_build_rsp()
1005 len = rsp->data_len + 22; in ipmi_lan_build_rsp()
1006 if (s->active) in ipmi_lan_build_rsp()
1021 msg[len++] = s->active ? s->authtype : 0; in ipmi_lan_build_rsp()
1023 if (s->in_seq) { in ipmi_lan_build_rsp()
1024 s->in_seq++; in ipmi_lan_build_rsp()
1025 if (s->in_seq == 0) in ipmi_lan_build_rsp()
1026 s->in_seq++; in ipmi_lan_build_rsp()
1028 memcpy(msg+len, &s->in_seq, 4); in ipmi_lan_build_rsp()
1030 memcpy(msg+len, &s->session_id, 4); in ipmi_lan_build_rsp()
1034 if (s->active && s->authtype) { in ipmi_lan_build_rsp()
1036 memcpy(msg+len, s->authcode, 16); in ipmi_lan_build_rsp()
1041 msg[len++] = rsp->data_len + 8; in ipmi_lan_build_rsp()
1046 msg[len++] = rsp->msg.netfn << 2; in ipmi_lan_build_rsp()
1047 tmp = len - cs; in ipmi_lan_build_rsp()
1051 msg[len++] = (rsp->msg.seq << 2) | (rsp->msg.lun & 3); in ipmi_lan_build_rsp()
1052 msg[len++] = rsp->msg.cmd; in ipmi_lan_build_rsp()
1055 msg[len++] = rsp->ccode; in ipmi_lan_build_rsp()
1058 if (rsp->data_len) { in ipmi_lan_build_rsp()
1059 memcpy(msg+len, rsp->data, rsp->data_len); in ipmi_lan_build_rsp()
1060 len += rsp->data_len; in ipmi_lan_build_rsp()
1064 tmp = len - cs; in ipmi_lan_build_rsp()
1067 if (s->active) { in ipmi_lan_build_rsp()
1069 switch (s->authtype) { in ipmi_lan_build_rsp()
1071 d = ipmi_auth_md5(s, msg+mp, msg[mp-1]); in ipmi_lan_build_rsp()
1075 d = ipmi_auth_md2(s, msg+mp, msg[mp-1]); in ipmi_lan_build_rsp()
1099 return -1; in ipmi_lan_send_rsp()
1102 rv = sendto(intf->fd, msg, len, 0, in ipmi_lan_send_rsp()
1103 (struct sockaddr *)&intf->session->addr, in ipmi_lan_send_rsp()
1104 intf->session->addrlen); in ipmi_lan_send_rsp()
1111 return -1; in ipmi_lan_send_rsp()
1123 * +--------------------+
1128 * +--------------------+
1132 * +--------------------+
1134 * +--------------------+
1140 * +--------------------+
1142 * +--------------------+
1153 struct ipmi_session * session = intf->session; in ipmi_lan_build_sol_msg()
1163 payload->payload.sol_packet.character_count; // The actual payload in ipmi_lan_build_sol_msg()
1178 msg[len++] = session->in_seq & 0xff; in ipmi_lan_build_sol_msg()
1179 msg[len++] = (session->in_seq >> 8) & 0xff; in ipmi_lan_build_sol_msg()
1180 msg[len++] = (session->in_seq >> 16) & 0xff; in ipmi_lan_build_sol_msg()
1181 msg[len++] = (session->in_seq >> 24) & 0xff; in ipmi_lan_build_sol_msg()
1183 msg[len++] = session->session_id & 0xff; in ipmi_lan_build_sol_msg()
1184 msg[len++] = (session->session_id >> 8) & 0xff; in ipmi_lan_build_sol_msg()
1185 msg[len++] = (session->session_id >> 16) & 0xff; in ipmi_lan_build_sol_msg()
1186 msg[len++] = ((session->session_id >> 24) + 0x10) & 0xff; /* Add 0x10 to MSB for SOL */ in ipmi_lan_build_sol_msg()
1188 msg[len++] = payload->payload.sol_packet.character_count + 5; in ipmi_lan_build_sol_msg()
1191 msg[len++] = payload->payload.sol_packet.packet_sequence_number; in ipmi_lan_build_sol_msg()
1192 msg[len++] = payload->payload.sol_packet.acked_packet_number; in ipmi_lan_build_sol_msg()
1193 msg[len++] = payload->payload.sol_packet.accepted_character_count; in ipmi_lan_build_sol_msg()
1194 msg[len] = payload->payload.sol_packet.is_nack ? 0x40 : 0; in ipmi_lan_build_sol_msg()
1195 msg[len] |= payload->payload.sol_packet.assert_ring_wor ? 0x20 : 0; in ipmi_lan_build_sol_msg()
1196 msg[len] |= payload->payload.sol_packet.generate_break ? 0x10 : 0; in ipmi_lan_build_sol_msg()
1197 msg[len] |= payload->payload.sol_packet.deassert_cts ? 0x08 : 0; in ipmi_lan_build_sol_msg()
1198 msg[len] |= payload->payload.sol_packet.deassert_dcd_dsr ? 0x04 : 0; in ipmi_lan_build_sol_msg()
1199 msg[len] |= payload->payload.sol_packet.flush_inbound ? 0x02 : 0; in ipmi_lan_build_sol_msg()
1200 msg[len++] |= payload->payload.sol_packet.flush_outbound ? 0x01 : 0; in ipmi_lan_build_sol_msg()
1204 if (payload->payload.sol_packet.character_count) { in ipmi_lan_build_sol_msg()
1207 payload->payload.sol_packet.data, in ipmi_lan_build_sol_msg()
1208 payload->payload.sol_packet.character_count); in ipmi_lan_build_sol_msg()
1209 len += payload->payload.sol_packet.character_count; in ipmi_lan_build_sol_msg()
1212 session->in_seq++; in ipmi_lan_build_sol_msg()
1213 if (session->in_seq == 0) in ipmi_lan_build_sol_msg()
1214 session->in_seq++; in ipmi_lan_build_sol_msg()
1227 (rsp->session.payloadtype == IPMI_PAYLOAD_TYPE_SOL)); in is_sol_packet()
1241 (payload->payload_type == IPMI_PAYLOAD_TYPE_SOL) && in sol_response_acks_packet()
1242 (rsp->payload.sol_packet.acked_packet_number == in sol_response_acks_packet()
1243 payload->payload.sol_packet.packet_sequence_number)); in sol_response_acks_packet()
1259 if (intf->opened == 0 && intf->open != NULL) { in ipmi_lan_send_sol_payload()
1260 if (intf->open(intf) < 0) in ipmi_lan_send_sol_payload()
1284 if (intf->noanswer) in ipmi_lan_send_sol_payload()
1287 if (payload->payload.sol_packet.packet_sequence_number == 0) { in ipmi_lan_send_sol_payload()
1299 else if (is_sol_packet(rsp) && rsp->data_len) in ipmi_lan_send_sol_payload()
1305 intf->session->sol_data.sol_input_handler(rsp); in ipmi_lan_send_sol_payload()
1309 if (++try >= intf->ssn_params.retry) { in ipmi_lan_send_sol_payload()
1340 (rsp->payload.sol_packet.accepted_character_count < in is_sol_partial_ack()
1341 v2_payload->payload.sol_packet.character_count)) in is_sol_partial_ack()
1343 if (rsp->payload.sol_packet.accepted_character_count == 0) { in is_sol_partial_ack()
1350 v2_payload->payload.sol_packet.character_count - in is_sol_partial_ack()
1351 rsp->payload.sol_packet.accepted_character_count; in is_sol_partial_ack()
1365 if (intf->session->sol_data.sequence_number > 0x0F) in set_sol_packet_sequence_number()
1366 intf->session->sol_data.sequence_number = 1; in set_sol_packet_sequence_number()
1368 v2_payload->payload.sol_packet.packet_sequence_number = in set_sol_packet_sequence_number()
1369 intf->session->sol_data.sequence_number++; in set_sol_packet_sequence_number()
1388 v2_payload->payload_type = IPMI_PAYLOAD_TYPE_SOL; in ipmi_lan_send_sol()
1394 v2_payload->payload.sol_packet.acked_packet_number = 0; /* NA */ in ipmi_lan_send_sol()
1398 v2_payload->payload.sol_packet.accepted_character_count = 0; /* NA */ in ipmi_lan_send_sol()
1411 if (rsp->data_len) in ipmi_lan_send_sol()
1412 intf->session->sol_data.sol_input_handler(rsp); in ipmi_lan_send_sol()
1417 memmove(v2_payload->payload.sol_packet.data, in ipmi_lan_send_sol()
1418 v2_payload->payload.sol_packet.data + in ipmi_lan_send_sol()
1419 rsp->payload.sol_packet.accepted_character_count, in ipmi_lan_send_sol()
1422 v2_payload->payload.sol_packet.character_count = chars_to_resend; in ipmi_lan_send_sol()
1453 (rsp->session.payloadtype == IPMI_PAYLOAD_TYPE_SOL)) in check_sol_packet_for_new_data()
1456 uint8_t unaltered_data_len = rsp->data_len; in check_sol_packet_for_new_data()
1457 if (rsp->payload.sol_packet.packet_sequence_number == in check_sol_packet_for_new_data()
1464 new_data_size = rsp->data_len - last_received_byte_count; in check_sol_packet_for_new_data()
1469 memmove(rsp->data, in check_sol_packet_for_new_data()
1470 rsp->data + in check_sol_packet_for_new_data()
1471 rsp->data_len - new_data_size, in check_sol_packet_for_new_data()
1475 rsp->data_len = new_data_size; in check_sol_packet_for_new_data()
1481 if (rsp && rsp->payload.sol_packet.packet_sequence_number) in check_sol_packet_for_new_data()
1484 rsp->payload.sol_packet.packet_sequence_number; in check_sol_packet_for_new_data()
1502 (rsp->session.payloadtype == IPMI_PAYLOAD_TYPE_SOL) && in ack_sol_packet()
1503 (rsp->payload.sol_packet.packet_sequence_number)) in ack_sol_packet()
1521 rsp->payload.sol_packet.packet_sequence_number; in ack_sol_packet()
1523 ack.payload.sol_packet.accepted_character_count = rsp->data_len; in ack_sol_packet()
1563 if (!intf->opened) in ipmi_lan_keepalive()
1566 rsp = intf->sendrecv(intf, &req); in ipmi_lan_keepalive()
1568 return -1; in ipmi_lan_keepalive()
1569 if (rsp->ccode > 0) in ipmi_lan_keepalive()
1570 return -1; in ipmi_lan_keepalive()
1583 struct ipmi_session * s = intf->session; in ipmi_get_auth_capabilities_cmd()
1584 struct ipmi_session_params *p = &intf->ssn_params; in ipmi_get_auth_capabilities_cmd()
1588 msg_data[1] = p->privlvl; in ipmi_get_auth_capabilities_cmd()
1596 rsp = intf->sendrecv(intf, &req); in ipmi_get_auth_capabilities_cmd()
1599 return -1; in ipmi_get_auth_capabilities_cmd()
1602 printbuf(rsp->data, rsp->data_len, "get_auth_capabilities"); in ipmi_get_auth_capabilities_cmd()
1604 if (rsp->ccode > 0) { in ipmi_get_auth_capabilities_cmd()
1606 val2str(rsp->ccode, completion_code_vals)); in ipmi_get_auth_capabilities_cmd()
1607 return -1; in ipmi_get_auth_capabilities_cmd()
1611 rsp->data[0]); in ipmi_get_auth_capabilities_cmd()
1615 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_NONE) ? "NONE " : "", in ipmi_get_auth_capabilities_cmd()
1616 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_MD2) ? "MD2 " : "", in ipmi_get_auth_capabilities_cmd()
1617 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_MD5) ? "MD5 " : "", in ipmi_get_auth_capabilities_cmd()
1618 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_PASSWORD) ? "PASSWORD " : "", in ipmi_get_auth_capabilities_cmd()
1619 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_OEM) ? "OEM " : ""); in ipmi_get_auth_capabilities_cmd()
1620 lprintf(LOG_DEBUG, " Per-msg auth : %sabled", in ipmi_get_auth_capabilities_cmd()
1621 (rsp->data[2] & IPMI_AUTHSTATUS_PER_MSG_DISABLED) ? in ipmi_get_auth_capabilities_cmd()
1623 lprintf(LOG_DEBUG, " User level auth : %sabled", in ipmi_get_auth_capabilities_cmd()
1624 (rsp->data[2] & IPMI_AUTHSTATUS_PER_USER_DISABLED) ? in ipmi_get_auth_capabilities_cmd()
1626 lprintf(LOG_DEBUG, " Non-null users : %sabled", in ipmi_get_auth_capabilities_cmd()
1627 (rsp->data[2] & IPMI_AUTHSTATUS_NONNULL_USERS_ENABLED) ? in ipmi_get_auth_capabilities_cmd()
1630 (rsp->data[2] & IPMI_AUTHSTATUS_NULL_USERS_ENABLED) ? in ipmi_get_auth_capabilities_cmd()
1633 (rsp->data[2] & IPMI_AUTHSTATUS_ANONYMOUS_USERS_ENABLED) ? in ipmi_get_auth_capabilities_cmd()
1637 s->authstatus = rsp->data[2]; in ipmi_get_auth_capabilities_cmd()
1639 if (p->password && in ipmi_get_auth_capabilities_cmd()
1640 (p->authtype_set == 0 || in ipmi_get_auth_capabilities_cmd()
1641 p->authtype_set == IPMI_SESSION_AUTHTYPE_MD5) && in ipmi_get_auth_capabilities_cmd()
1642 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_MD5)) in ipmi_get_auth_capabilities_cmd()
1644 s->authtype = IPMI_SESSION_AUTHTYPE_MD5; in ipmi_get_auth_capabilities_cmd()
1646 else if (p->password && in ipmi_get_auth_capabilities_cmd()
1647 (p->authtype_set == 0 || in ipmi_get_auth_capabilities_cmd()
1648 p->authtype_set == IPMI_SESSION_AUTHTYPE_MD2) && in ipmi_get_auth_capabilities_cmd()
1649 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_MD2)) in ipmi_get_auth_capabilities_cmd()
1651 s->authtype = IPMI_SESSION_AUTHTYPE_MD2; in ipmi_get_auth_capabilities_cmd()
1653 else if (p->password && in ipmi_get_auth_capabilities_cmd()
1654 (p->authtype_set == 0 || in ipmi_get_auth_capabilities_cmd()
1655 p->authtype_set == IPMI_SESSION_AUTHTYPE_PASSWORD) && in ipmi_get_auth_capabilities_cmd()
1656 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_PASSWORD)) in ipmi_get_auth_capabilities_cmd()
1658 s->authtype = IPMI_SESSION_AUTHTYPE_PASSWORD; in ipmi_get_auth_capabilities_cmd()
1660 else if (p->password && in ipmi_get_auth_capabilities_cmd()
1661 (p->authtype_set == 0 || in ipmi_get_auth_capabilities_cmd()
1662 p->authtype_set == IPMI_SESSION_AUTHTYPE_OEM) && in ipmi_get_auth_capabilities_cmd()
1663 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_OEM)) in ipmi_get_auth_capabilities_cmd()
1665 s->authtype = IPMI_SESSION_AUTHTYPE_OEM; in ipmi_get_auth_capabilities_cmd()
1667 else if ((p->authtype_set == 0 || in ipmi_get_auth_capabilities_cmd()
1668 p->authtype_set == IPMI_SESSION_AUTHTYPE_NONE) && in ipmi_get_auth_capabilities_cmd()
1669 (rsp->data[1] & 1<<IPMI_SESSION_AUTHTYPE_NONE)) in ipmi_get_auth_capabilities_cmd()
1671 s->authtype = IPMI_SESSION_AUTHTYPE_NONE; in ipmi_get_auth_capabilities_cmd()
1674 if (!(rsp->data[1] & 1<<p->authtype_set)) in ipmi_get_auth_capabilities_cmd()
1676 val2str(p->authtype_set, ipmi_authtype_session_vals)); in ipmi_get_auth_capabilities_cmd()
1680 return -1; in ipmi_get_auth_capabilities_cmd()
1684 val2str(s->authtype, ipmi_authtype_session_vals)); in ipmi_get_auth_capabilities_cmd()
1690 * IPMI Get Session Challenge Command
1691 * returns a temporary session ID and 16 byte challenge string
1698 struct ipmi_session * s = intf->session; in ipmi_get_session_challenge_cmd()
1702 msg_data[0] = s->authtype; in ipmi_get_session_challenge_cmd()
1703 memcpy(msg_data+1, intf->ssn_params.username, 16); in ipmi_get_session_challenge_cmd()
1709 req.msg.data_len = 17; /* 1 byte for authtype, 16 for user */ in ipmi_get_session_challenge_cmd()
1711 rsp = intf->sendrecv(intf, &req); in ipmi_get_session_challenge_cmd()
1713 lprintf(LOG_ERR, "Get Session Challenge command failed"); in ipmi_get_session_challenge_cmd()
1714 return -1; in ipmi_get_session_challenge_cmd()
1717 printbuf(rsp->data, rsp->data_len, "get_session_challenge"); in ipmi_get_session_challenge_cmd()
1719 if (rsp->ccode > 0) { in ipmi_get_session_challenge_cmd()
1720 switch (rsp->ccode) { in ipmi_get_session_challenge_cmd()
1722 lprintf(LOG_ERR, "Invalid user name"); in ipmi_get_session_challenge_cmd()
1725 lprintf(LOG_ERR, "NULL user name not enabled"); in ipmi_get_session_challenge_cmd()
1728 lprintf(LOG_ERR, "Get Session Challenge command failed: %s", in ipmi_get_session_challenge_cmd()
1729 val2str(rsp->ccode, completion_code_vals)); in ipmi_get_session_challenge_cmd()
1731 return -1; in ipmi_get_session_challenge_cmd()
1734 memcpy(&s->session_id, rsp->data, 4); in ipmi_get_session_challenge_cmd()
1735 memcpy(s->challenge, rsp->data + 4, 16); in ipmi_get_session_challenge_cmd()
1738 lprintf(LOG_DEBUG, " Session ID : %08lx", (long)s->session_id); in ipmi_get_session_challenge_cmd()
1739 lprintf(LOG_DEBUG, " Challenge : %s", buf2str(s->challenge, 16)); in ipmi_get_session_challenge_cmd()
1752 struct ipmi_session * s = intf->session; in ipmi_activate_session_cmd()
1759 msg_data[0] = s->authtype; in ipmi_activate_session_cmd()
1760 msg_data[1] = intf->ssn_params.privlvl; in ipmi_activate_session_cmd()
1765 memcpy(intf->session->authcode, special, 16); in ipmi_activate_session_cmd()
1770 memcpy(msg_data + 2, s->challenge, 16); in ipmi_activate_session_cmd()
1779 s->active = 1; in ipmi_activate_session_cmd()
1784 val2str(s->authtype, ipmi_authtype_session_vals)); in ipmi_activate_session_cmd()
1786 rsp = intf->sendrecv(intf, &req); in ipmi_activate_session_cmd()
1789 s->active = 0; in ipmi_activate_session_cmd()
1790 return -1; in ipmi_activate_session_cmd()
1793 printbuf(rsp->data, rsp->data_len, "activate_session"); in ipmi_activate_session_cmd()
1795 if (rsp->ccode) { in ipmi_activate_session_cmd()
1797 switch (rsp->ccode) { in ipmi_activate_session_cmd()
1802 lprintf(LOG_ERR, "\tNo slot available for given user - " in ipmi_activate_session_cmd()
1806 lprintf(LOG_ERR, "\tNo slot available to support user " in ipmi_activate_session_cmd()
1824 val2str(rsp->ccode, completion_code_vals)); in ipmi_activate_session_cmd()
1826 return -1; in ipmi_activate_session_cmd()
1829 memcpy(&s->session_id, rsp->data + 1, 4); in ipmi_activate_session_cmd()
1830 s->in_seq = rsp->data[8] << 24 | rsp->data[7] << 16 | rsp->data[6] << 8 | rsp->data[5]; in ipmi_activate_session_cmd()
1831 if (s->in_seq == 0) in ipmi_activate_session_cmd()
1832 ++s->in_seq; in ipmi_activate_session_cmd()
1834 if (s->authstatus & IPMI_AUTHSTATUS_PER_MSG_DISABLED) in ipmi_activate_session_cmd()
1835 s->authtype = IPMI_SESSION_AUTHTYPE_NONE; in ipmi_activate_session_cmd()
1836 else if (s->authtype != (rsp->data[0] & 0xf)) { in ipmi_activate_session_cmd()
1838 val2str(s->authtype, ipmi_authtype_session_vals)); in ipmi_activate_session_cmd()
1839 return -1; in ipmi_activate_session_cmd()
1844 val2str(rsp->data[0], ipmi_authtype_session_vals)); in ipmi_activate_session_cmd()
1846 val2str(rsp->data[9], ipmi_privlvl_vals)); in ipmi_activate_session_cmd()
1847 lprintf(LOG_DEBUG, " Session ID : %08lx", (long)s->session_id); in ipmi_activate_session_cmd()
1848 lprintf(LOG_DEBUG, " Inbound Seq : %08lx\n", (long)s->in_seq); in ipmi_activate_session_cmd()
1862 uint8_t privlvl = intf->ssn_params.privlvl; in ipmi_set_session_privlvl_cmd()
1875 rsp = intf->sendrecv(intf, &req); in ipmi_set_session_privlvl_cmd()
1881 return -1; in ipmi_set_session_privlvl_cmd()
1884 printbuf(rsp->data, rsp->data_len, "set_session_privlvl"); in ipmi_set_session_privlvl_cmd()
1886 if (rsp->ccode > 0) { in ipmi_set_session_privlvl_cmd()
1889 val2str(rsp->ccode, completion_code_vals)); in ipmi_set_session_privlvl_cmd()
1890 return -1; in ipmi_set_session_privlvl_cmd()
1894 val2str(rsp->data[0], ipmi_privlvl_vals)); in ipmi_set_session_privlvl_cmd()
1905 uint32_t session_id = intf->session->session_id; in ipmi_close_session_cmd()
1907 if (intf->session->active == 0) in ipmi_close_session_cmd()
1908 return -1; in ipmi_close_session_cmd()
1910 intf->target_addr = IPMI_BMC_SLAVE_ADDR; in ipmi_close_session_cmd()
1921 rsp = intf->sendrecv(intf, &req); in ipmi_close_session_cmd()
1924 return -1; in ipmi_close_session_cmd()
1927 printbuf(rsp->data, rsp->data_len, "close_session"); in ipmi_close_session_cmd()
1929 if (rsp->ccode == 0x87) { in ipmi_close_session_cmd()
1932 return -1; in ipmi_close_session_cmd()
1934 if (rsp->ccode > 0) { in ipmi_close_session_cmd()
1936 val2str(rsp->ccode, completion_code_vals)); in ipmi_close_session_cmd()
1937 return -1; in ipmi_close_session_cmd()
1952 * about supported challenge/response authentication types
1953 * 3. send "Get Session Challenge" command with AUTHTYPE = none
1955 * packet will contain challenge string and temporary session ID.
1991 intf->abort = 0; in ipmi_lan_activate_session()
2003 return -1; in ipmi_lan_activate_session()
2009 if (!intf->abort && intf->session) in ipmi_lan_close()
2012 if (intf->fd >= 0) { in ipmi_lan_close()
2013 close(intf->fd); in ipmi_lan_close()
2014 intf->fd = -1; in ipmi_lan_close()
2019 intf->opened = 0; in ipmi_lan_close()
2020 intf->manufacturer_id = IPMI_OEM_UNKNOWN; in ipmi_lan_close()
2031 if (intf == NULL || intf->opened) in ipmi_lan_open()
2032 return -1; in ipmi_lan_open()
2034 s = intf->session; in ipmi_lan_open()
2035 p = &intf->ssn_params; in ipmi_lan_open()
2037 if (p->port == 0) in ipmi_lan_open()
2038 p->port = IPMI_LAN_PORT; in ipmi_lan_open()
2039 if (p->privlvl == 0) in ipmi_lan_open()
2040 p->privlvl = IPMI_SESSION_PRIV_ADMIN; in ipmi_lan_open()
2041 if (p->timeout == 0) in ipmi_lan_open()
2042 p->timeout = IPMI_LAN_TIMEOUT; in ipmi_lan_open()
2043 if (p->retry == 0) in ipmi_lan_open()
2044 p->retry = IPMI_LAN_RETRY; in ipmi_lan_open()
2046 if (p->hostname == NULL || strlen((const char *)p->hostname) == 0) { in ipmi_lan_open()
2048 return -1; in ipmi_lan_open()
2051 if (ipmi_intf_socket_connect(intf) == -1) { in ipmi_lan_open()
2053 return -1; in ipmi_lan_open()
2062 intf->opened = 1; in ipmi_lan_open()
2063 intf->abort = 1; in ipmi_lan_open()
2065 intf->session = s; in ipmi_lan_open()
2068 s->sol_data.sequence_number = 1; in ipmi_lan_open()
2069 s->timeout = p->timeout; in ipmi_lan_open()
2070 memcpy(&s->authcode, &p->authcode_set, sizeof(s->authcode)); in ipmi_lan_open()
2071 s->addrlen = sizeof(s->addr); in ipmi_lan_open()
2072 if (getsockname(intf->fd, (struct sockaddr *)&s->addr, &s->addrlen)) { in ipmi_lan_open()
2086 intf->manufacturer_id = ipmi_get_oem(intf); in ipmi_lan_open()
2090 return intf->fd; in ipmi_lan_open()
2094 intf->close(intf); in ipmi_lan_open()
2095 return -1; in ipmi_lan_open()
2102 intf->max_request_data_size = IPMI_LAN_MAX_REQUEST_SIZE; in ipmi_lan_setup()
2103 intf->max_response_data_size = IPMI_LAN_MAX_RESPONSE_SIZE; in ipmi_lan_setup()
2112 size = 0xFF - 7; in ipmi_lan_set_max_rq_data_size()
2115 intf->max_request_data_size = size; in ipmi_lan_set_max_rq_data_size()
2122 size = 0xFF - 8; in ipmi_lan_set_max_rp_data_size()
2125 intf->max_response_data_size = size; in ipmi_lan_set_max_rp_data_size()