@@ -64,7 +64,6 @@ struct tipc_member {
64
64
struct rb_node tree_node ;
65
65
struct list_head list ;
66
66
struct list_head small_win ;
67
- struct sk_buff * event_msg ;
68
67
struct sk_buff_head deferredq ;
69
68
struct tipc_group * group ;
70
69
u32 node ;
@@ -632,6 +631,40 @@ void tipc_group_update_rcv_win(struct tipc_group *grp, int blks, u32 node,
632
631
}
633
632
}
634
633
634
+ static void tipc_group_create_event (struct tipc_group * grp ,
635
+ struct tipc_member * m ,
636
+ u32 event , u16 seqno ,
637
+ struct sk_buff_head * inputq )
638
+ { u32 dnode = tipc_own_addr (grp -> net );
639
+ struct tipc_event evt ;
640
+ struct sk_buff * skb ;
641
+ struct tipc_msg * hdr ;
642
+
643
+ evt .event = event ;
644
+ evt .found_lower = m -> instance ;
645
+ evt .found_upper = m -> instance ;
646
+ evt .port .ref = m -> port ;
647
+ evt .port .node = m -> node ;
648
+ evt .s .seq .type = grp -> type ;
649
+ evt .s .seq .lower = m -> instance ;
650
+ evt .s .seq .upper = m -> instance ;
651
+
652
+ skb = tipc_msg_create (TIPC_CRITICAL_IMPORTANCE , TIPC_GRP_MEMBER_EVT ,
653
+ GROUP_H_SIZE , sizeof (evt ), dnode , m -> node ,
654
+ grp -> portid , m -> port , 0 );
655
+ if (!skb )
656
+ return ;
657
+
658
+ hdr = buf_msg (skb );
659
+ msg_set_nametype (hdr , grp -> type );
660
+ msg_set_grp_evt (hdr , event );
661
+ msg_set_dest_droppable (hdr , true);
662
+ msg_set_grp_bc_seqno (hdr , seqno );
663
+ memcpy (msg_data (hdr ), & evt , sizeof (evt ));
664
+ TIPC_SKB_CB (skb )-> orig_member = m -> instance ;
665
+ __skb_queue_tail (inputq , skb );
666
+ }
667
+
635
668
static void tipc_group_proto_xmit (struct tipc_group * grp , struct tipc_member * m ,
636
669
int mtyp , struct sk_buff_head * xmitq )
637
670
{
@@ -677,7 +710,6 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
677
710
u32 node = msg_orignode (hdr );
678
711
u32 port = msg_origport (hdr );
679
712
struct tipc_member * m , * pm ;
680
- struct tipc_msg * ehdr ;
681
713
u16 remitted , in_flight ;
682
714
683
715
if (!grp )
@@ -704,9 +736,8 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
704
736
* usr_wakeup = true;
705
737
m -> usr_pending = false;
706
738
tipc_group_proto_xmit (grp , m , GRP_ADV_MSG , xmitq );
707
- ehdr = buf_msg (m -> event_msg );
708
- msg_set_grp_bc_seqno (ehdr , m -> bc_syncpt );
709
- __skb_queue_tail (inputq , m -> event_msg );
739
+ tipc_group_create_event (grp , m , TIPC_PUBLISHED ,
740
+ m -> bc_syncpt , inputq );
710
741
}
711
742
list_del_init (& m -> small_win );
712
743
tipc_group_update_member (m , 0 );
@@ -725,10 +756,9 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
725
756
m -> state = MBR_LEAVING ;
726
757
return ;
727
758
}
728
- /* Otherwise deliver already received WITHDRAW event */
729
- ehdr = buf_msg (m -> event_msg );
730
- msg_set_grp_bc_seqno (ehdr , m -> bc_syncpt );
731
- __skb_queue_tail (inputq , m -> event_msg );
759
+ /* Otherwise deliver member WITHDRAW event */
760
+ tipc_group_create_event (grp , m , TIPC_WITHDRAWN ,
761
+ m -> bc_syncpt , inputq );
732
762
return ;
733
763
case GRP_ADV_MSG :
734
764
if (!m )
@@ -797,11 +827,10 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
797
827
void tipc_group_member_evt (struct tipc_group * grp ,
798
828
bool * usr_wakeup ,
799
829
int * sk_rcvbuf ,
800
- struct sk_buff * skb ,
830
+ struct tipc_msg * hdr ,
801
831
struct sk_buff_head * inputq ,
802
832
struct sk_buff_head * xmitq )
803
833
{
804
- struct tipc_msg * hdr = buf_msg (skb );
805
834
struct tipc_event * evt = (void * )msg_data (hdr );
806
835
u32 instance = evt -> found_lower ;
807
836
u32 node = evt -> port .node ;
@@ -813,21 +842,12 @@ void tipc_group_member_evt(struct tipc_group *grp,
813
842
u32 self ;
814
843
815
844
if (!grp )
816
- goto drop ;
845
+ return ;
817
846
818
847
net = grp -> net ;
819
848
self = tipc_own_addr (net );
820
849
if (!grp -> loopback && node == self && port == grp -> portid )
821
- goto drop ;
822
-
823
- /* Convert message before delivery to user */
824
- msg_set_hdr_sz (hdr , GROUP_H_SIZE );
825
- msg_set_user (hdr , TIPC_CRITICAL_IMPORTANCE );
826
- msg_set_type (hdr , TIPC_GRP_MEMBER_EVT );
827
- msg_set_origport (hdr , port );
828
- msg_set_orignode (hdr , node );
829
- msg_set_nametype (hdr , grp -> type );
830
- msg_set_grp_evt (hdr , event );
850
+ return ;
831
851
832
852
m = tipc_group_find_member (grp , node , port );
833
853
@@ -836,59 +856,52 @@ void tipc_group_member_evt(struct tipc_group *grp,
836
856
m = tipc_group_create_member (grp , node , port ,
837
857
MBR_DISCOVERED );
838
858
if (!m )
839
- goto drop ;
859
+ return ;
860
+
861
+ m -> instance = instance ;
840
862
841
863
/* Hold back event if JOIN message not yet received */
842
864
if (m -> state == MBR_DISCOVERED ) {
843
- m -> event_msg = skb ;
844
865
m -> state = MBR_PUBLISHED ;
845
866
} else {
846
- msg_set_grp_bc_seqno ( hdr , m -> bc_syncpt );
847
- __skb_queue_tail ( inputq , skb );
867
+ tipc_group_create_event ( grp , m , TIPC_PUBLISHED ,
868
+ m -> bc_syncpt , inputq );
848
869
m -> state = MBR_JOINED ;
849
870
* usr_wakeup = true;
850
871
m -> usr_pending = false;
851
872
}
852
- m -> instance = instance ;
853
- TIPC_SKB_CB (skb )-> orig_member = m -> instance ;
854
873
tipc_group_proto_xmit (grp , m , GRP_JOIN_MSG , xmitq );
855
874
tipc_group_update_member (m , 0 );
856
875
} else if (event == TIPC_WITHDRAWN ) {
857
876
if (!m )
858
- goto drop ;
859
-
860
- TIPC_SKB_CB (skb )-> orig_member = m -> instance ;
877
+ return ;
861
878
862
879
* usr_wakeup = true;
863
880
m -> usr_pending = false;
864
881
node_up = tipc_node_is_up (net , node );
865
- m -> event_msg = NULL ;
866
882
867
883
if (node_up ) {
868
884
/* Hold back event if a LEAVE msg should be expected */
869
885
if (m -> state != MBR_LEAVING ) {
870
- m -> event_msg = skb ;
871
886
tipc_group_decr_active (grp , m );
872
887
m -> state = MBR_LEAVING ;
873
888
} else {
874
- msg_set_grp_bc_seqno ( hdr , m -> bc_syncpt );
875
- __skb_queue_tail ( inputq , skb );
889
+ tipc_group_create_event ( grp , m , TIPC_WITHDRAWN ,
890
+ m -> bc_syncpt , inputq );
876
891
}
877
892
} else {
878
893
if (m -> state != MBR_LEAVING ) {
879
894
tipc_group_decr_active (grp , m );
880
895
m -> state = MBR_LEAVING ;
881
- msg_set_grp_bc_seqno (hdr , m -> bc_rcv_nxt );
896
+ tipc_group_create_event (grp , m , TIPC_WITHDRAWN ,
897
+ m -> bc_rcv_nxt , inputq );
882
898
} else {
883
- msg_set_grp_bc_seqno (hdr , m -> bc_syncpt );
899
+ tipc_group_create_event (grp , m , TIPC_WITHDRAWN ,
900
+ m -> bc_syncpt , inputq );
884
901
}
885
- __skb_queue_tail (inputq , skb );
886
902
}
887
903
list_del_init (& m -> list );
888
904
list_del_init (& m -> small_win );
889
905
}
890
906
* sk_rcvbuf = tipc_group_rcvbuf_limit (grp );
891
- return ;
892
- drop :
893
- kfree_skb (skb );
894
907
}
0 commit comments