0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #define CREATE_TRACE_POINTS
0037 #include "trace.h"
0038
0039
0040
0041
0042
0043 unsigned long sysctl_tipc_sk_filter[5] __read_mostly = {0, };
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053 int tipc_skb_dump(struct sk_buff *skb, bool more, char *buf)
0054 {
0055 int i = 0;
0056 size_t sz = (more) ? SKB_LMAX : SKB_LMIN;
0057 struct tipc_msg *hdr;
0058 struct tipc_skb_cb *skbcb;
0059
0060 if (!skb) {
0061 i += scnprintf(buf, sz, "msg: (null)\n");
0062 return i;
0063 }
0064
0065 hdr = buf_msg(skb);
0066 skbcb = TIPC_SKB_CB(skb);
0067
0068
0069 i += scnprintf(buf, sz, "msg: %u", msg_user(hdr));
0070 i += scnprintf(buf + i, sz - i, " %u", msg_type(hdr));
0071 i += scnprintf(buf + i, sz - i, " %u", msg_hdr_sz(hdr));
0072 i += scnprintf(buf + i, sz - i, " %u", msg_data_sz(hdr));
0073 i += scnprintf(buf + i, sz - i, " %x", msg_orignode(hdr));
0074 i += scnprintf(buf + i, sz - i, " %x", msg_destnode(hdr));
0075 i += scnprintf(buf + i, sz - i, " %u", msg_seqno(hdr));
0076 i += scnprintf(buf + i, sz - i, " %u", msg_ack(hdr));
0077 i += scnprintf(buf + i, sz - i, " %u", msg_bcast_ack(hdr));
0078 switch (msg_user(hdr)) {
0079 case LINK_PROTOCOL:
0080 i += scnprintf(buf + i, sz - i, " %c", msg_net_plane(hdr));
0081 i += scnprintf(buf + i, sz - i, " %u", msg_probe(hdr));
0082 i += scnprintf(buf + i, sz - i, " %u", msg_peer_stopping(hdr));
0083 i += scnprintf(buf + i, sz - i, " %u", msg_session(hdr));
0084 i += scnprintf(buf + i, sz - i, " %u", msg_next_sent(hdr));
0085 i += scnprintf(buf + i, sz - i, " %u", msg_seq_gap(hdr));
0086 i += scnprintf(buf + i, sz - i, " %u", msg_bc_snd_nxt(hdr));
0087 i += scnprintf(buf + i, sz - i, " %u", msg_bc_gap(hdr));
0088 break;
0089 case TIPC_LOW_IMPORTANCE:
0090 case TIPC_MEDIUM_IMPORTANCE:
0091 case TIPC_HIGH_IMPORTANCE:
0092 case TIPC_CRITICAL_IMPORTANCE:
0093 case CONN_MANAGER:
0094 case SOCK_WAKEUP:
0095 i += scnprintf(buf + i, sz - i, " | %u", msg_origport(hdr));
0096 i += scnprintf(buf + i, sz - i, " %u", msg_destport(hdr));
0097 switch (msg_type(hdr)) {
0098 case TIPC_NAMED_MSG:
0099 i += scnprintf(buf + i, sz - i, " %u",
0100 msg_nametype(hdr));
0101 i += scnprintf(buf + i, sz - i, " %u",
0102 msg_nameinst(hdr));
0103 break;
0104 case TIPC_MCAST_MSG:
0105 i += scnprintf(buf + i, sz - i, " %u",
0106 msg_nametype(hdr));
0107 i += scnprintf(buf + i, sz - i, " %u",
0108 msg_namelower(hdr));
0109 i += scnprintf(buf + i, sz - i, " %u",
0110 msg_nameupper(hdr));
0111 break;
0112 default:
0113 break;
0114 }
0115 i += scnprintf(buf + i, sz - i, " | %u",
0116 msg_src_droppable(hdr));
0117 i += scnprintf(buf + i, sz - i, " %u",
0118 msg_dest_droppable(hdr));
0119 i += scnprintf(buf + i, sz - i, " %u", msg_errcode(hdr));
0120 i += scnprintf(buf + i, sz - i, " %u", msg_reroute_cnt(hdr));
0121 break;
0122 default:
0123
0124 break;
0125 }
0126
0127 i += scnprintf(buf + i, sz - i, "\n");
0128 if (!more)
0129 return i;
0130
0131
0132 i += scnprintf(buf + i, sz - i, "skb: %s",
0133 (skb->dev) ? skb->dev->name : "n/a");
0134 i += scnprintf(buf + i, sz - i, " %u", skb->len);
0135 i += scnprintf(buf + i, sz - i, " %u", skb->data_len);
0136 i += scnprintf(buf + i, sz - i, " %u", skb->hdr_len);
0137 i += scnprintf(buf + i, sz - i, " %u", skb->truesize);
0138 i += scnprintf(buf + i, sz - i, " %u", skb_cloned(skb));
0139 i += scnprintf(buf + i, sz - i, " %p", skb->sk);
0140 i += scnprintf(buf + i, sz - i, " %u", skb_shinfo(skb)->nr_frags);
0141 i += scnprintf(buf + i, sz - i, " %llx",
0142 ktime_to_ms(skb_get_ktime(skb)));
0143 i += scnprintf(buf + i, sz - i, " %llx\n",
0144 ktime_to_ms(skb_hwtstamps(skb)->hwtstamp));
0145
0146
0147 i += scnprintf(buf + i, sz - i, "cb[]: %u", skbcb->bytes_read);
0148 i += scnprintf(buf + i, sz - i, " %u", skbcb->orig_member);
0149 i += scnprintf(buf + i, sz - i, " %u",
0150 jiffies_to_msecs(skbcb->nxt_retr));
0151 i += scnprintf(buf + i, sz - i, " %u", skbcb->validated);
0152 i += scnprintf(buf + i, sz - i, " %u", skbcb->chain_imp);
0153 i += scnprintf(buf + i, sz - i, " %u\n", skbcb->ackers);
0154
0155 return i;
0156 }
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166 int tipc_list_dump(struct sk_buff_head *list, bool more, char *buf)
0167 {
0168 int i = 0;
0169 size_t sz = (more) ? LIST_LMAX : LIST_LMIN;
0170 u32 count, len;
0171 struct sk_buff *hskb, *tskb, *skb, *tmp;
0172
0173 if (!list) {
0174 i += scnprintf(buf, sz, "(null)\n");
0175 return i;
0176 }
0177
0178 len = skb_queue_len(list);
0179 i += scnprintf(buf, sz, "len = %d\n", len);
0180
0181 if (!len)
0182 return i;
0183
0184 if (!more) {
0185 hskb = skb_peek(list);
0186 i += scnprintf(buf + i, sz - i, " head ");
0187 i += tipc_skb_dump(hskb, false, buf + i);
0188 if (len > 1) {
0189 tskb = skb_peek_tail(list);
0190 i += scnprintf(buf + i, sz - i, " tail ");
0191 i += tipc_skb_dump(tskb, false, buf + i);
0192 }
0193 } else {
0194 count = 0;
0195 skb_queue_walk_safe(list, skb, tmp) {
0196 count++;
0197 if (count == 6)
0198 i += scnprintf(buf + i, sz - i, " .\n .\n");
0199 if (count > 5 && count <= len - 5)
0200 continue;
0201 i += scnprintf(buf + i, sz - i, " #%d ", count);
0202 i += tipc_skb_dump(skb, false, buf + i);
0203 }
0204 }
0205 return i;
0206 }