~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to net/tipc/msg.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
 * net/tipc/msg.c: TIPC message header routines
3
3
 *
4
4
 * Copyright (c) 2000-2006, Ericsson AB
5
 
 * Copyright (c) 2005, Wind River Systems
 
5
 * Copyright (c) 2005, 2010-2011, Wind River Systems
6
6
 * All rights reserved.
7
7
 *
8
8
 * Redistribution and use in source and binary forms, with or without
68
68
}
69
69
 
70
70
/**
71
 
 * tipc_msg_calc_data_size - determine total data size for message
72
 
 */
73
 
 
74
 
int tipc_msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect)
75
 
{
76
 
        int dsz = 0;
77
 
        int i;
78
 
 
79
 
        for (i = 0; i < num_sect; i++)
80
 
                dsz += msg_sect[i].iov_len;
81
 
        return dsz;
82
 
}
83
 
 
84
 
/**
85
71
 * tipc_msg_build - create message using specified header and data
86
72
 *
87
73
 * Note: Caller must not hold any locks in case copy_from_user() is interrupted!
89
75
 * Returns message data size or errno
90
76
 */
91
77
 
92
 
int tipc_msg_build(struct tipc_msg *hdr,
93
 
                            struct iovec const *msg_sect, u32 num_sect,
 
78
int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect,
 
79
                   u32 num_sect, unsigned int total_len,
94
80
                            int max_size, int usrmem, struct sk_buff **buf)
95
81
{
96
82
        int dsz, sz, hsz, pos, res, cnt;
97
83
 
98
 
        dsz = tipc_msg_calc_data_size(msg_sect, num_sect);
99
 
        if (unlikely(dsz > TIPC_MAX_USER_MSG_SIZE)) {
100
 
                *buf = NULL;
101
 
                return -EINVAL;
102
 
        }
103
 
 
 
84
        dsz = total_len;
104
85
        pos = hsz = msg_hdr_sz(hdr);
105
86
        sz = hsz + dsz;
106
87
        msg_set_size(hdr, sz);
192
173
                default:
193
174
                        tipc_printf(buf, "UNKNOWN TYPE %u", msg_type(msg));
194
175
                }
195
 
                if (msg_routed(msg) && !msg_non_seq(msg))
196
 
                        tipc_printf(buf, "ROUT:");
197
176
                if (msg_reroute_cnt(msg))
198
177
                        tipc_printf(buf, "REROUTED(%u):",
199
178
                                    msg_reroute_cnt(msg));
210
189
                default:
211
190
                        tipc_printf(buf, "UNKNOWN:%x", msg_type(msg));
212
191
                }
213
 
                if (msg_routed(msg))
214
 
                        tipc_printf(buf, "ROUT:");
215
192
                if (msg_reroute_cnt(msg))
216
193
                        tipc_printf(buf, "REROUTED(%u):",
217
194
                                    msg_reroute_cnt(msg));
232
209
                default:
233
210
                        tipc_printf(buf, "UNKNOWN TYPE:%x", msg_type(msg));
234
211
                }
235
 
                if (msg_routed(msg))
236
 
                        tipc_printf(buf, "ROUT:");
237
212
                if (msg_reroute_cnt(msg))
238
213
                        tipc_printf(buf, "REROUTED(%u):", msg_reroute_cnt(msg));
239
214
                break;
240
215
        case LINK_PROTOCOL:
241
 
                tipc_printf(buf, "PROT:TIM(%u):", msg_timestamp(msg));
242
216
                switch (msg_type(msg)) {
243
217
                case STATE_MSG:
244
218
                        tipc_printf(buf, "STATE:");
275
249
                        tipc_printf(buf, "UNKNOWN TYPE:%x", msg_type(msg));
276
250
                }
277
251
                break;
278
 
        case ROUTE_DISTRIBUTOR:
279
 
                tipc_printf(buf, "ROUTING_MNG:");
280
 
                switch (msg_type(msg)) {
281
 
                case EXT_ROUTING_TABLE:
282
 
                        tipc_printf(buf, "EXT_TBL:");
283
 
                        tipc_printf(buf, "TO:%x:", msg_remote_node(msg));
284
 
                        break;
285
 
                case LOCAL_ROUTING_TABLE:
286
 
                        tipc_printf(buf, "LOCAL_TBL:");
287
 
                        tipc_printf(buf, "TO:%x:", msg_remote_node(msg));
288
 
                        break;
289
 
                case SLAVE_ROUTING_TABLE:
290
 
                        tipc_printf(buf, "DP_TBL:");
291
 
                        tipc_printf(buf, "TO:%x:", msg_remote_node(msg));
292
 
                        break;
293
 
                case ROUTE_ADDITION:
294
 
                        tipc_printf(buf, "ADD:");
295
 
                        tipc_printf(buf, "TO:%x:", msg_remote_node(msg));
296
 
                        break;
297
 
                case ROUTE_REMOVAL:
298
 
                        tipc_printf(buf, "REMOVE:");
299
 
                        tipc_printf(buf, "TO:%x:", msg_remote_node(msg));
300
 
                        break;
301
 
                default:
302
 
                        tipc_printf(buf, "UNKNOWN TYPE:%x", msg_type(msg));
303
 
                }
304
 
                break;
305
252
        case LINK_CONFIG:
306
253
                tipc_printf(buf, "CFG:");
307
254
                switch (msg_type(msg)) {
381
328
                        tipc_printf(buf, ":OPRT(%u):", msg_origport(msg));
382
329
                        tipc_printf(buf, ":DPRT(%u):", msg_destport(msg));
383
330
                }
384
 
                if (msg_routed(msg) && !msg_non_seq(msg))
385
 
                        tipc_printf(buf, ":TSEQN(%u)", msg_transp_seqno(msg));
386
331
        }
387
332
        if (msg_user(msg) == NAME_DISTRIBUTOR) {
388
333
                tipc_printf(buf, ":ONOD(%x):", msg_orignode(msg));
389
334
                tipc_printf(buf, ":DNOD(%x):", msg_destnode(msg));
390
 
                if (msg_routed(msg))
391
 
                        tipc_printf(buf, ":CSEQN(%u)", msg_transp_seqno(msg));
392
335
        }
393
336
 
394
337
        if (msg_user(msg) ==  LINK_CONFIG) {
395
338
                u32 *raw = (u32 *)msg;
396
339
                struct tipc_media_addr *orig = (struct tipc_media_addr *)&raw[5];
397
 
                tipc_printf(buf, ":REQL(%u):", msg_req_links(msg));
398
340
                tipc_printf(buf, ":DDOM(%x):", msg_dest_domain(msg));
399
341
                tipc_printf(buf, ":NETID(%u):", msg_bc_netid(msg));
400
342
                tipc_media_addr_printf(buf, orig);