Skip to content

Commit 1d70ec7

Browse files
committed
Merge branch 'tipc'
Jon Maloy says: ==================== tipc: clean up socket message reception Despite recent improvements the message reception code in socket.c is perceived as obscure and hard to follow, especially regarding the logics for message rejection. With the commits in this series we try to remedy this situation. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents a69e5a0 + cda3696 commit 1d70ec7

File tree

4 files changed

+213
-203
lines changed

4 files changed

+213
-203
lines changed

net/tipc/msg.c

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -463,60 +463,72 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, struct tipc_msg *msg,
463463

464464
/**
465465
* tipc_msg_reverse(): swap source and destination addresses and add error code
466-
* @buf: buffer containing message to be reversed
467-
* @dnode: return value: node where to send message after reversal
468-
* @err: error code to be set in message
469-
* Consumes buffer if failure
466+
* @own_node: originating node id for reversed message
467+
* @skb: buffer containing message to be reversed; may be replaced.
468+
* @err: error code to be set in message, if any
469+
* Consumes buffer at failure
470470
* Returns true if success, otherwise false
471471
*/
472-
bool tipc_msg_reverse(u32 own_addr, struct sk_buff *buf, u32 *dnode,
473-
int err)
472+
bool tipc_msg_reverse(u32 own_node, struct sk_buff **skb, int err)
474473
{
475-
struct tipc_msg *msg = buf_msg(buf);
474+
struct sk_buff *_skb = *skb;
475+
struct tipc_msg *hdr = buf_msg(_skb);
476476
struct tipc_msg ohdr;
477-
uint rdsz = min_t(uint, msg_data_sz(msg), MAX_FORWARD_SIZE);
477+
int dlen = min_t(uint, msg_data_sz(hdr), MAX_FORWARD_SIZE);
478478

479-
if (skb_linearize(buf))
479+
if (skb_linearize(_skb))
480480
goto exit;
481-
msg = buf_msg(buf);
482-
if (msg_dest_droppable(msg))
481+
hdr = buf_msg(_skb);
482+
if (msg_dest_droppable(hdr))
483483
goto exit;
484-
if (msg_errcode(msg))
484+
if (msg_errcode(hdr))
485485
goto exit;
486-
memcpy(&ohdr, msg, msg_hdr_sz(msg));
487-
msg_set_errcode(msg, err);
488-
msg_set_origport(msg, msg_destport(&ohdr));
489-
msg_set_destport(msg, msg_origport(&ohdr));
490-
msg_set_prevnode(msg, own_addr);
491-
if (!msg_short(msg)) {
492-
msg_set_orignode(msg, msg_destnode(&ohdr));
493-
msg_set_destnode(msg, msg_orignode(&ohdr));
486+
487+
/* Take a copy of original header before altering message */
488+
memcpy(&ohdr, hdr, msg_hdr_sz(hdr));
489+
490+
/* Never return SHORT header; expand by replacing buffer if necessary */
491+
if (msg_short(hdr)) {
492+
*skb = tipc_buf_acquire(BASIC_H_SIZE + dlen);
493+
if (!*skb)
494+
goto exit;
495+
memcpy((*skb)->data + BASIC_H_SIZE, msg_data(hdr), dlen);
496+
kfree_skb(_skb);
497+
_skb = *skb;
498+
hdr = buf_msg(_skb);
499+
memcpy(hdr, &ohdr, BASIC_H_SIZE);
500+
msg_set_hdr_sz(hdr, BASIC_H_SIZE);
494501
}
495-
msg_set_size(msg, msg_hdr_sz(msg) + rdsz);
496-
skb_trim(buf, msg_size(msg));
497-
skb_orphan(buf);
498-
*dnode = msg_orignode(&ohdr);
502+
503+
/* Now reverse the concerned fields */
504+
msg_set_errcode(hdr, err);
505+
msg_set_origport(hdr, msg_destport(&ohdr));
506+
msg_set_destport(hdr, msg_origport(&ohdr));
507+
msg_set_destnode(hdr, msg_prevnode(&ohdr));
508+
msg_set_prevnode(hdr, own_node);
509+
msg_set_orignode(hdr, own_node);
510+
msg_set_size(hdr, msg_hdr_sz(hdr) + dlen);
511+
skb_trim(_skb, msg_size(hdr));
512+
skb_orphan(_skb);
499513
return true;
500514
exit:
501-
kfree_skb(buf);
502-
*dnode = 0;
515+
kfree_skb(_skb);
516+
*skb = NULL;
503517
return false;
504518
}
505519

506520
/**
507521
* tipc_msg_lookup_dest(): try to find new destination for named message
508522
* @skb: the buffer containing the message.
509-
* @dnode: return value: next-hop node, if destination found
510-
* @err: return value: error code to use, if message to be rejected
523+
* @err: error code to be used by caller if lookup fails
511524
* Does not consume buffer
512525
* Returns true if a destination is found, false otherwise
513526
*/
514-
bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb,
515-
u32 *dnode, int *err)
527+
bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)
516528
{
517529
struct tipc_msg *msg = buf_msg(skb);
518-
u32 dport;
519-
u32 own_addr = tipc_own_addr(net);
530+
u32 dport, dnode;
531+
u32 onode = tipc_own_addr(net);
520532

521533
if (!msg_isdata(msg))
522534
return false;
@@ -529,15 +541,15 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb,
529541
return false;
530542
if (msg_reroute_cnt(msg))
531543
return false;
532-
*dnode = addr_domain(net, msg_lookup_scope(msg));
544+
dnode = addr_domain(net, msg_lookup_scope(msg));
533545
dport = tipc_nametbl_translate(net, msg_nametype(msg),
534-
msg_nameinst(msg), dnode);
546+
msg_nameinst(msg), &dnode);
535547
if (!dport)
536548
return false;
537549
msg_incr_reroute_cnt(msg);
538-
if (*dnode != own_addr)
539-
msg_set_prevnode(msg, own_addr);
540-
msg_set_destnode(msg, *dnode);
550+
if (dnode != onode)
551+
msg_set_prevnode(msg, onode);
552+
msg_set_destnode(msg, dnode);
541553
msg_set_destport(msg, dport);
542554
*err = TIPC_OK;
543555
return true;

net/tipc/msg.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -785,8 +785,7 @@ static inline bool msg_peer_is_up(struct tipc_msg *m)
785785

786786
struct sk_buff *tipc_buf_acquire(u32 size);
787787
bool tipc_msg_validate(struct sk_buff *skb);
788-
bool tipc_msg_reverse(u32 own_addr, struct sk_buff *buf, u32 *dnode,
789-
int err);
788+
bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err);
790789
void tipc_msg_init(u32 own_addr, struct tipc_msg *m, u32 user, u32 type,
791790
u32 hsize, u32 destnode);
792791
struct sk_buff *tipc_msg_create(uint user, uint type, uint hdr_sz,
@@ -799,8 +798,7 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, struct tipc_msg *msg,
799798
bool tipc_msg_extract(struct sk_buff *skb, struct sk_buff **iskb, int *pos);
800799
int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,
801800
int offset, int dsz, int mtu, struct sk_buff_head *list);
802-
bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, u32 *dnode,
803-
int *err);
801+
bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err);
804802
struct sk_buff *tipc_msg_reassemble(struct sk_buff_head *list);
805803

806804
static inline u16 buf_seqno(struct sk_buff *skb)

0 commit comments

Comments
 (0)