1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#ifndef _TIPC_MSG_H
38#define _TIPC_MSG_H
39
40#include "bearer.h"
41
42#define TIPC_VERSION 2
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79#define TIPC_CONN_MSG 0
80#define TIPC_MCAST_MSG 1
81#define TIPC_NAMED_MSG 2
82#define TIPC_DIRECT_MSG 3
83
84
85#define SHORT_H_SIZE 24
86#define DIR_MSG_H_SIZE 32
87#define LONG_H_SIZE 40
88#define MCAST_H_SIZE 44
89#define INT_H_SIZE 40
90#define MIN_H_SIZE 24
91#define MAX_H_SIZE 60
92
93#define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE)
94
95
96struct tipc_msg {
97 __be32 hdr[15];
98};
99
100
101static inline u32 msg_word(struct tipc_msg *m, u32 pos)
102{
103 return ntohl(m->hdr[pos]);
104}
105
106static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val)
107{
108 m->hdr[w] = htonl(val);
109}
110
111static inline u32 msg_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask)
112{
113 return (msg_word(m, w) >> pos) & mask;
114}
115
116static inline void msg_set_bits(struct tipc_msg *m, u32 w,
117 u32 pos, u32 mask, u32 val)
118{
119 val = (val & mask) << pos;
120 mask = mask << pos;
121 m->hdr[w] &= ~htonl(mask);
122 m->hdr[w] |= htonl(val);
123}
124
125static inline void msg_swap_words(struct tipc_msg *msg, u32 a, u32 b)
126{
127 u32 temp = msg->hdr[a];
128
129 msg->hdr[a] = msg->hdr[b];
130 msg->hdr[b] = temp;
131}
132
133
134
135
136
137static inline u32 msg_version(struct tipc_msg *m)
138{
139 return msg_bits(m, 0, 29, 7);
140}
141
142static inline void msg_set_version(struct tipc_msg *m)
143{
144 msg_set_bits(m, 0, 29, 7, TIPC_VERSION);
145}
146
147static inline u32 msg_user(struct tipc_msg *m)
148{
149 return msg_bits(m, 0, 25, 0xf);
150}
151
152static inline u32 msg_isdata(struct tipc_msg *m)
153{
154 return msg_user(m) <= TIPC_CRITICAL_IMPORTANCE;
155}
156
157static inline void msg_set_user(struct tipc_msg *m, u32 n)
158{
159 msg_set_bits(m, 0, 25, 0xf, n);
160}
161
162static inline u32 msg_importance(struct tipc_msg *m)
163{
164 return msg_bits(m, 0, 25, 0xf);
165}
166
167static inline void msg_set_importance(struct tipc_msg *m, u32 i)
168{
169 msg_set_user(m, i);
170}
171
172static inline u32 msg_hdr_sz(struct tipc_msg *m)
173{
174 return msg_bits(m, 0, 21, 0xf) << 2;
175}
176
177static inline void msg_set_hdr_sz(struct tipc_msg *m, u32 n)
178{
179 msg_set_bits(m, 0, 21, 0xf, n>>2);
180}
181
182static inline u32 msg_size(struct tipc_msg *m)
183{
184 return msg_bits(m, 0, 0, 0x1ffff);
185}
186
187static inline u32 msg_data_sz(struct tipc_msg *m)
188{
189 return msg_size(m) - msg_hdr_sz(m);
190}
191
192static inline int msg_non_seq(struct tipc_msg *m)
193{
194 return msg_bits(m, 0, 20, 1);
195}
196
197static inline void msg_set_non_seq(struct tipc_msg *m, u32 n)
198{
199 msg_set_bits(m, 0, 20, 1, n);
200}
201
202static inline int msg_dest_droppable(struct tipc_msg *m)
203{
204 return msg_bits(m, 0, 19, 1);
205}
206
207static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d)
208{
209 msg_set_bits(m, 0, 19, 1, d);
210}
211
212static inline int msg_src_droppable(struct tipc_msg *m)
213{
214 return msg_bits(m, 0, 18, 1);
215}
216
217static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d)
218{
219 msg_set_bits(m, 0, 18, 1, d);
220}
221
222static inline void msg_set_size(struct tipc_msg *m, u32 sz)
223{
224 m->hdr[0] = htonl((msg_word(m, 0) & ~0x1ffff) | sz);
225}
226
227
228
229
230
231
232static inline u32 msg_type(struct tipc_msg *m)
233{
234 return msg_bits(m, 1, 29, 0x7);
235}
236
237static inline void msg_set_type(struct tipc_msg *m, u32 n)
238{
239 msg_set_bits(m, 1, 29, 0x7, n);
240}
241
242static inline u32 msg_named(struct tipc_msg *m)
243{
244 return msg_type(m) == TIPC_NAMED_MSG;
245}
246
247static inline u32 msg_mcast(struct tipc_msg *m)
248{
249 return msg_type(m) == TIPC_MCAST_MSG;
250}
251
252static inline u32 msg_connected(struct tipc_msg *m)
253{
254 return msg_type(m) == TIPC_CONN_MSG;
255}
256
257static inline u32 msg_errcode(struct tipc_msg *m)
258{
259 return msg_bits(m, 1, 25, 0xf);
260}
261
262static inline void msg_set_errcode(struct tipc_msg *m, u32 err)
263{
264 msg_set_bits(m, 1, 25, 0xf, err);
265}
266
267static inline u32 msg_reroute_cnt(struct tipc_msg *m)
268{
269 return msg_bits(m, 1, 21, 0xf);
270}
271
272static inline void msg_incr_reroute_cnt(struct tipc_msg *m)
273{
274 msg_set_bits(m, 1, 21, 0xf, msg_reroute_cnt(m) + 1);
275}
276
277static inline void msg_reset_reroute_cnt(struct tipc_msg *m)
278{
279 msg_set_bits(m, 1, 21, 0xf, 0);
280}
281
282static inline u32 msg_lookup_scope(struct tipc_msg *m)
283{
284 return msg_bits(m, 1, 19, 0x3);
285}
286
287static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n)
288{
289 msg_set_bits(m, 1, 19, 0x3, n);
290}
291
292static inline u32 msg_bcast_ack(struct tipc_msg *m)
293{
294 return msg_bits(m, 1, 0, 0xffff);
295}
296
297static inline void msg_set_bcast_ack(struct tipc_msg *m, u32 n)
298{
299 msg_set_bits(m, 1, 0, 0xffff, n);
300}
301
302
303
304
305
306
307static inline u32 msg_ack(struct tipc_msg *m)
308{
309 return msg_bits(m, 2, 16, 0xffff);
310}
311
312static inline void msg_set_ack(struct tipc_msg *m, u32 n)
313{
314 msg_set_bits(m, 2, 16, 0xffff, n);
315}
316
317static inline u32 msg_seqno(struct tipc_msg *m)
318{
319 return msg_bits(m, 2, 0, 0xffff);
320}
321
322static inline void msg_set_seqno(struct tipc_msg *m, u32 n)
323{
324 msg_set_bits(m, 2, 0, 0xffff, n);
325}
326
327
328
329
330
331
332
333
334
335
336
337static inline u32 msg_destnode_cache(struct tipc_msg *m)
338{
339 return m->hdr[2];
340}
341
342static inline void msg_set_destnode_cache(struct tipc_msg *m, u32 dnode)
343{
344 m->hdr[2] = dnode;
345}
346
347
348
349
350
351
352static inline u32 msg_prevnode(struct tipc_msg *m)
353{
354 return msg_word(m, 3);
355}
356
357static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)
358{
359 msg_set_word(m, 3, a);
360}
361
362static inline u32 msg_origport(struct tipc_msg *m)
363{
364 return msg_word(m, 4);
365}
366
367static inline void msg_set_origport(struct tipc_msg *m, u32 p)
368{
369 msg_set_word(m, 4, p);
370}
371
372static inline u32 msg_destport(struct tipc_msg *m)
373{
374 return msg_word(m, 5);
375}
376
377static inline void msg_set_destport(struct tipc_msg *m, u32 p)
378{
379 msg_set_word(m, 5, p);
380}
381
382static inline u32 msg_mc_netid(struct tipc_msg *m)
383{
384 return msg_word(m, 5);
385}
386
387static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
388{
389 msg_set_word(m, 5, p);
390}
391
392static inline int msg_short(struct tipc_msg *m)
393{
394 return msg_hdr_sz(m) == 24;
395}
396
397static inline u32 msg_orignode(struct tipc_msg *m)
398{
399 if (likely(msg_short(m)))
400 return msg_prevnode(m);
401 return msg_word(m, 6);
402}
403
404static inline void msg_set_orignode(struct tipc_msg *m, u32 a)
405{
406 msg_set_word(m, 6, a);
407}
408
409static inline u32 msg_destnode(struct tipc_msg *m)
410{
411 return msg_word(m, 7);
412}
413
414static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
415{
416 msg_set_word(m, 7, a);
417}
418
419static inline int msg_is_dest(struct tipc_msg *m, u32 d)
420{
421 return msg_short(m) || (msg_destnode(m) == d);
422}
423
424static inline u32 msg_routed(struct tipc_msg *m)
425{
426 if (likely(msg_short(m)))
427 return 0;
428 return (msg_destnode(m) ^ msg_orignode(m)) >> 11;
429}
430
431static inline u32 msg_nametype(struct tipc_msg *m)
432{
433 return msg_word(m, 8);
434}
435
436static inline void msg_set_nametype(struct tipc_msg *m, u32 n)
437{
438 msg_set_word(m, 8, n);
439}
440
441static inline u32 msg_transp_seqno(struct tipc_msg *m)
442{
443 return msg_word(m, 8);
444}
445
446static inline void msg_set_timestamp(struct tipc_msg *m, u32 n)
447{
448 msg_set_word(m, 8, n);
449}
450
451static inline u32 msg_timestamp(struct tipc_msg *m)
452{
453 return msg_word(m, 8);
454}
455
456static inline void msg_set_transp_seqno(struct tipc_msg *m, u32 n)
457{
458 msg_set_word(m, 8, n);
459}
460
461static inline u32 msg_nameinst(struct tipc_msg *m)
462{
463 return msg_word(m, 9);
464}
465
466static inline u32 msg_namelower(struct tipc_msg *m)
467{
468 return msg_nameinst(m);
469}
470
471static inline void msg_set_namelower(struct tipc_msg *m, u32 n)
472{
473 msg_set_word(m, 9, n);
474}
475
476static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)
477{
478 msg_set_namelower(m, n);
479}
480
481static inline u32 msg_nameupper(struct tipc_msg *m)
482{
483 return msg_word(m, 10);
484}
485
486static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)
487{
488 msg_set_word(m, 10, n);
489}
490
491static inline unchar *msg_data(struct tipc_msg *m)
492{
493 return ((unchar *)m) + msg_hdr_sz(m);
494}
495
496static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m)
497{
498 return (struct tipc_msg *)msg_data(m);
499}
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539#define BCAST_PROTOCOL 5
540#define MSG_BUNDLER 6
541#define LINK_PROTOCOL 7
542#define CONN_MANAGER 8
543#define ROUTE_DISTRIBUTOR 9
544#define CHANGEOVER_PROTOCOL 10
545#define NAME_DISTRIBUTOR 11
546#define MSG_FRAGMENTER 12
547#define LINK_CONFIG 13
548#define DSC_H_SIZE 40
549
550
551
552
553
554#define CONN_PROBE 0
555#define CONN_PROBE_REPLY 1
556#define CONN_ACK 2
557
558
559
560
561
562#define PUBLICATION 0
563#define WITHDRAWAL 1
564
565
566
567
568
569
570static inline u32 msg_seq_gap(struct tipc_msg *m)
571{
572 return msg_bits(m, 1, 16, 0x1fff);
573}
574
575static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n)
576{
577 msg_set_bits(m, 1, 16, 0x1fff, n);
578}
579
580static inline u32 msg_req_links(struct tipc_msg *m)
581{
582 return msg_bits(m, 1, 16, 0xfff);
583}
584
585static inline void msg_set_req_links(struct tipc_msg *m, u32 n)
586{
587 msg_set_bits(m, 1, 16, 0xfff, n);
588}
589
590
591
592
593
594
595static inline u32 msg_dest_domain(struct tipc_msg *m)
596{
597 return msg_word(m, 2);
598}
599
600static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n)
601{
602 msg_set_word(m, 2, n);
603}
604
605static inline u32 msg_bcgap_after(struct tipc_msg *m)
606{
607 return msg_bits(m, 2, 16, 0xffff);
608}
609
610static inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n)
611{
612 msg_set_bits(m, 2, 16, 0xffff, n);
613}
614
615static inline u32 msg_bcgap_to(struct tipc_msg *m)
616{
617 return msg_bits(m, 2, 0, 0xffff);
618}
619
620static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n)
621{
622 msg_set_bits(m, 2, 0, 0xffff, n);
623}
624
625
626
627
628
629
630static inline u32 msg_last_bcast(struct tipc_msg *m)
631{
632 return msg_bits(m, 4, 16, 0xffff);
633}
634
635static inline void msg_set_last_bcast(struct tipc_msg *m, u32 n)
636{
637 msg_set_bits(m, 4, 16, 0xffff, n);
638}
639
640
641static inline u32 msg_fragm_no(struct tipc_msg *m)
642{
643 return msg_bits(m, 4, 16, 0xffff);
644}
645
646static inline void msg_set_fragm_no(struct tipc_msg *m, u32 n)
647{
648 msg_set_bits(m, 4, 16, 0xffff, n);
649}
650
651
652static inline u32 msg_next_sent(struct tipc_msg *m)
653{
654 return msg_bits(m, 4, 0, 0xffff);
655}
656
657static inline void msg_set_next_sent(struct tipc_msg *m, u32 n)
658{
659 msg_set_bits(m, 4, 0, 0xffff, n);
660}
661
662
663static inline u32 msg_long_msgno(struct tipc_msg *m)
664{
665 return msg_bits(m, 4, 0, 0xffff);
666}
667
668static inline void msg_set_long_msgno(struct tipc_msg *m, u32 n)
669{
670 msg_set_bits(m, 4, 0, 0xffff, n);
671}
672
673static inline u32 msg_bc_netid(struct tipc_msg *m)
674{
675 return msg_word(m, 4);
676}
677
678static inline void msg_set_bc_netid(struct tipc_msg *m, u32 id)
679{
680 msg_set_word(m, 4, id);
681}
682
683static inline u32 msg_link_selector(struct tipc_msg *m)
684{
685 return msg_bits(m, 4, 0, 1);
686}
687
688static inline void msg_set_link_selector(struct tipc_msg *m, u32 n)
689{
690 msg_set_bits(m, 4, 0, 1, (n & 1));
691}
692
693
694
695
696
697static inline u32 msg_session(struct tipc_msg *m)
698{
699 return msg_bits(m, 5, 16, 0xffff);
700}
701
702static inline void msg_set_session(struct tipc_msg *m, u32 n)
703{
704 msg_set_bits(m, 5, 16, 0xffff, n);
705}
706
707static inline u32 msg_probe(struct tipc_msg *m)
708{
709 return msg_bits(m, 5, 0, 1);
710}
711
712static inline void msg_set_probe(struct tipc_msg *m, u32 val)
713{
714 msg_set_bits(m, 5, 0, 1, (val & 1));
715}
716
717static inline char msg_net_plane(struct tipc_msg *m)
718{
719 return msg_bits(m, 5, 1, 7) + 'A';
720}
721
722static inline void msg_set_net_plane(struct tipc_msg *m, char n)
723{
724 msg_set_bits(m, 5, 1, 7, (n - 'A'));
725}
726
727static inline u32 msg_linkprio(struct tipc_msg *m)
728{
729 return msg_bits(m, 5, 4, 0x1f);
730}
731
732static inline void msg_set_linkprio(struct tipc_msg *m, u32 n)
733{
734 msg_set_bits(m, 5, 4, 0x1f, n);
735}
736
737static inline u32 msg_bearer_id(struct tipc_msg *m)
738{
739 return msg_bits(m, 5, 9, 0x7);
740}
741
742static inline void msg_set_bearer_id(struct tipc_msg *m, u32 n)
743{
744 msg_set_bits(m, 5, 9, 0x7, n);
745}
746
747static inline u32 msg_redundant_link(struct tipc_msg *m)
748{
749 return msg_bits(m, 5, 12, 0x1);
750}
751
752static inline void msg_set_redundant_link(struct tipc_msg *m)
753{
754 msg_set_bits(m, 5, 12, 0x1, 1);
755}
756
757static inline void msg_clear_redundant_link(struct tipc_msg *m)
758{
759 msg_set_bits(m, 5, 12, 0x1, 0);
760}
761
762
763
764
765
766
767static inline u32 msg_msgcnt(struct tipc_msg *m)
768{
769 return msg_bits(m, 9, 16, 0xffff);
770}
771
772static inline void msg_set_msgcnt(struct tipc_msg *m, u32 n)
773{
774 msg_set_bits(m, 9, 16, 0xffff, n);
775}
776
777static inline u32 msg_bcast_tag(struct tipc_msg *m)
778{
779 return msg_bits(m, 9, 16, 0xffff);
780}
781
782static inline void msg_set_bcast_tag(struct tipc_msg *m, u32 n)
783{
784 msg_set_bits(m, 9, 16, 0xffff, n);
785}
786
787static inline u32 msg_max_pkt(struct tipc_msg *m)
788{
789 return msg_bits(m, 9, 16, 0xffff) * 4;
790}
791
792static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n)
793{
794 msg_set_bits(m, 9, 16, 0xffff, (n / 4));
795}
796
797static inline u32 msg_link_tolerance(struct tipc_msg *m)
798{
799 return msg_bits(m, 9, 0, 0xffff);
800}
801
802static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n)
803{
804 msg_set_bits(m, 9, 0, 0xffff, n);
805}
806
807
808
809
810
811
812static inline u32 msg_remote_node(struct tipc_msg *m)
813{
814 return msg_word(m, msg_hdr_sz(m)/4);
815}
816
817static inline void msg_set_remote_node(struct tipc_msg *m, u32 a)
818{
819 msg_set_word(m, msg_hdr_sz(m)/4, a);
820}
821
822
823
824
825
826#define FIRST_FRAGMENT 0
827#define FRAGMENT 1
828#define LAST_FRAGMENT 2
829
830
831
832
833
834#define STATE_MSG 0
835#define RESET_MSG 1
836#define ACTIVATE_MSG 2
837
838
839
840
841#define DUPLICATE_MSG 0
842#define ORIGINAL_MSG 1
843
844
845
846
847#define EXT_ROUTING_TABLE 0
848#define LOCAL_ROUTING_TABLE 1
849#define SLAVE_ROUTING_TABLE 2
850#define ROUTE_ADDITION 3
851#define ROUTE_REMOVAL 4
852
853
854
855
856
857#define DSC_REQ_MSG 0
858#define DSC_RESP_MSG 1
859
860u32 tipc_msg_tot_importance(struct tipc_msg *m);
861void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type,
862 u32 hsize, u32 destnode);
863int tipc_msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect);
864int tipc_msg_build(struct tipc_msg *hdr,
865 struct iovec const *msg_sect, u32 num_sect,
866 int max_size, int usrmem, struct sk_buff **buf);
867
868static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
869{
870 memcpy(&((int *)m)[5], a, sizeof(*a));
871}
872
873static inline void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
874{
875 memcpy(a, &((int *)m)[5], sizeof(*a));
876}
877
878#endif
879