midcomms.c (643f5cfa610f475c7465e4158b2b1fdd170fac10) midcomms.c (1151935182b40bbe398905850f6f7f4fbb262e06)
1// SPDX-License-Identifier: GPL-2.0-only
2/******************************************************************************
3*******************************************************************************
4**
5** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
6** Copyright (C) 2004-2021 Red Hat, Inc. All rights reserved.
7**
8**

--- 485 unchanged lines hidden (view full) ---

494 log_print("%s: unexpected state: %d",
495 __func__, node->state);
496 WARN_ON_ONCE(1);
497 return;
498 }
499 spin_unlock(&node->state_lock);
500}
501
1// SPDX-License-Identifier: GPL-2.0-only
2/******************************************************************************
3*******************************************************************************
4**
5** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
6** Copyright (C) 2004-2021 Red Hat, Inc. All rights reserved.
7**
8**

--- 485 unchanged lines hidden (view full) ---

494 log_print("%s: unexpected state: %d",
495 __func__, node->state);
496 WARN_ON_ONCE(1);
497 return;
498 }
499 spin_unlock(&node->state_lock);
500}
501
502static void dlm_receive_buffer_3_2_trace(uint32_t seq, union dlm_packet *p)
502static void dlm_receive_buffer_3_2_trace(uint32_t seq,
503 const union dlm_packet *p)
503{
504 switch (p->header.h_cmd) {
505 case DLM_MSG:
506 trace_dlm_recv_message(dlm_our_nodeid(), seq, &p->message);
507 break;
508 case DLM_RCOM:
509 trace_dlm_recv_rcom(dlm_our_nodeid(), seq, &p->rcom);
510 break;
511 default:
512 break;
513 }
514}
515
504{
505 switch (p->header.h_cmd) {
506 case DLM_MSG:
507 trace_dlm_recv_message(dlm_our_nodeid(), seq, &p->message);
508 break;
509 case DLM_RCOM:
510 trace_dlm_recv_rcom(dlm_our_nodeid(), seq, &p->rcom);
511 break;
512 default:
513 break;
514 }
515}
516
516static void dlm_midcomms_receive_buffer(union dlm_packet *p,
517static void dlm_midcomms_receive_buffer(const union dlm_packet *p,
517 struct midcomms_node *node,
518 uint32_t seq)
519{
520 bool is_expected_seq;
521 uint32_t oval, nval;
522
523 do {
524 oval = atomic_read(&node->seq_next);

--- 178 unchanged lines hidden (view full) ---

703 log_print_ratelimited("version mismatch detected, assumed 0x%08x but node %d has 0x%08x",
704 DLM_VERSION_3_2, node->nodeid, node->version);
705 return -1;
706 }
707
708 return 0;
709}
710
518 struct midcomms_node *node,
519 uint32_t seq)
520{
521 bool is_expected_seq;
522 uint32_t oval, nval;
523
524 do {
525 oval = atomic_read(&node->seq_next);

--- 178 unchanged lines hidden (view full) ---

704 log_print_ratelimited("version mismatch detected, assumed 0x%08x but node %d has 0x%08x",
705 DLM_VERSION_3_2, node->nodeid, node->version);
706 return -1;
707 }
708
709 return 0;
710}
711
711static int dlm_opts_check_msglen(union dlm_packet *p, uint16_t msglen, int nodeid)
712static int dlm_opts_check_msglen(const union dlm_packet *p, uint16_t msglen,
713 int nodeid)
712{
713 int len = msglen;
714
715 /* we only trust outer header msglen because
716 * it's checked against receive buffer length.
717 */
718 if (len < sizeof(struct dlm_opts))
719 return -1;

--- 32 unchanged lines hidden (view full) ---

752 log_print("unsupported o_nextcmd received: %u, will skip this message from node %d",
753 p->opts.o_nextcmd, nodeid);
754 return -1;
755 }
756
757 return 0;
758}
759
714{
715 int len = msglen;
716
717 /* we only trust outer header msglen because
718 * it's checked against receive buffer length.
719 */
720 if (len < sizeof(struct dlm_opts))
721 return -1;

--- 32 unchanged lines hidden (view full) ---

754 log_print("unsupported o_nextcmd received: %u, will skip this message from node %d",
755 p->opts.o_nextcmd, nodeid);
756 return -1;
757 }
758
759 return 0;
760}
761
760static void dlm_midcomms_receive_buffer_3_2(union dlm_packet *p, int nodeid)
762static void dlm_midcomms_receive_buffer_3_2(const union dlm_packet *p, int nodeid)
761{
762 uint16_t msglen = le16_to_cpu(p->header.h_length);
763 struct midcomms_node *node;
764 uint32_t seq;
765 int ret, idx;
766
767 idx = srcu_read_lock(&nodes_srcu);
768 node = dlm_midcomms_recv_node_lookup(nodeid, p, msglen,

--- 104 unchanged lines hidden (view full) ---

873 log_print_ratelimited("version mismatch detected, assumed 0x%08x but node %d has 0x%08x",
874 DLM_VERSION_3_1, node->nodeid, node->version);
875 return -1;
876 }
877
878 return 0;
879}
880
763{
764 uint16_t msglen = le16_to_cpu(p->header.h_length);
765 struct midcomms_node *node;
766 uint32_t seq;
767 int ret, idx;
768
769 idx = srcu_read_lock(&nodes_srcu);
770 node = dlm_midcomms_recv_node_lookup(nodeid, p, msglen,

--- 104 unchanged lines hidden (view full) ---

875 log_print_ratelimited("version mismatch detected, assumed 0x%08x but node %d has 0x%08x",
876 DLM_VERSION_3_1, node->nodeid, node->version);
877 return -1;
878 }
879
880 return 0;
881}
882
881static void dlm_midcomms_receive_buffer_3_1(union dlm_packet *p, int nodeid)
883static void dlm_midcomms_receive_buffer_3_1(const union dlm_packet *p, int nodeid)
882{
883 uint16_t msglen = le16_to_cpu(p->header.h_length);
884 struct midcomms_node *node;
885 int idx;
886
887 idx = srcu_read_lock(&nodes_srcu);
888 node = dlm_midcomms_recv_node_lookup(nodeid, p, msglen,
889 dlm_midcomms_version_check_3_1);

--- 82 unchanged lines hidden (view full) ---

972 hd = (struct dlm_header *)ptr;
973
974 msglen = le16_to_cpu(hd->h_length);
975 if (msglen > len)
976 break;
977
978 switch (hd->h_version) {
979 case cpu_to_le32(DLM_VERSION_3_1):
884{
885 uint16_t msglen = le16_to_cpu(p->header.h_length);
886 struct midcomms_node *node;
887 int idx;
888
889 idx = srcu_read_lock(&nodes_srcu);
890 node = dlm_midcomms_recv_node_lookup(nodeid, p, msglen,
891 dlm_midcomms_version_check_3_1);

--- 82 unchanged lines hidden (view full) ---

974 hd = (struct dlm_header *)ptr;
975
976 msglen = le16_to_cpu(hd->h_length);
977 if (msglen > len)
978 break;
979
980 switch (hd->h_version) {
981 case cpu_to_le32(DLM_VERSION_3_1):
980 dlm_midcomms_receive_buffer_3_1((union dlm_packet *)ptr, nodeid);
982 dlm_midcomms_receive_buffer_3_1((const union dlm_packet *)ptr, nodeid);
981 break;
982 case cpu_to_le32(DLM_VERSION_3_2):
983 break;
984 case cpu_to_le32(DLM_VERSION_3_2):
983 dlm_midcomms_receive_buffer_3_2((union dlm_packet *)ptr, nodeid);
985 dlm_midcomms_receive_buffer_3_2((const union dlm_packet *)ptr, nodeid);
984 break;
985 default:
986 log_print("received invalid version header: %u from node %d, will skip this message",
987 le32_to_cpu(hd->h_version), nodeid);
988 break;
989 }
990
991 ret += msglen;

--- 566 unchanged lines hidden ---
986 break;
987 default:
988 log_print("received invalid version header: %u from node %d, will skip this message",
989 le32_to_cpu(hd->h_version), nodeid);
990 break;
991 }
992
993 ret += msglen;

--- 566 unchanged lines hidden ---