diff options
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/link.c | 18 | ||||
-rw-r--r-- | net/tipc/link.h | 1 | ||||
-rw-r--r-- | net/tipc/msg.c | 25 | ||||
-rw-r--r-- | net/tipc/msg.h | 5 | ||||
-rw-r--r-- | net/tipc/port.c | 49 | ||||
-rw-r--r-- | net/tipc/port.h | 14 | ||||
-rw-r--r-- | net/tipc/socket.c | 14 | ||||
-rw-r--r-- | net/tipc/subscr.c | 4 |
8 files changed, 64 insertions, 66 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c index 2a9f44a203eb..4bab139d5e74 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -92,7 +92,8 @@ static int link_recv_changeover_msg(struct link **l_ptr, struct sk_buff **buf); | |||
92 | static void link_set_supervision_props(struct link *l_ptr, u32 tolerance); | 92 | static void link_set_supervision_props(struct link *l_ptr, u32 tolerance); |
93 | static int link_send_sections_long(struct tipc_port *sender, | 93 | static int link_send_sections_long(struct tipc_port *sender, |
94 | struct iovec const *msg_sect, | 94 | struct iovec const *msg_sect, |
95 | u32 num_sect, u32 destnode); | 95 | u32 num_sect, unsigned int total_len, |
96 | u32 destnode); | ||
96 | static void link_check_defragm_bufs(struct link *l_ptr); | 97 | static void link_check_defragm_bufs(struct link *l_ptr); |
97 | static void link_state_event(struct link *l_ptr, u32 event); | 98 | static void link_state_event(struct link *l_ptr, u32 event); |
98 | static void link_reset_statistics(struct link *l_ptr); | 99 | static void link_reset_statistics(struct link *l_ptr); |
@@ -1043,6 +1044,7 @@ int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode) | |||
1043 | int tipc_link_send_sections_fast(struct tipc_port *sender, | 1044 | int tipc_link_send_sections_fast(struct tipc_port *sender, |
1044 | struct iovec const *msg_sect, | 1045 | struct iovec const *msg_sect, |
1045 | const u32 num_sect, | 1046 | const u32 num_sect, |
1047 | unsigned int total_len, | ||
1046 | u32 destaddr) | 1048 | u32 destaddr) |
1047 | { | 1049 | { |
1048 | struct tipc_msg *hdr = &sender->phdr; | 1050 | struct tipc_msg *hdr = &sender->phdr; |
@@ -1058,8 +1060,8 @@ again: | |||
1058 | * (Must not hold any locks while building message.) | 1060 | * (Must not hold any locks while building message.) |
1059 | */ | 1061 | */ |
1060 | 1062 | ||
1061 | res = tipc_msg_build(hdr, msg_sect, num_sect, sender->max_pkt, | 1063 | res = tipc_msg_build(hdr, msg_sect, num_sect, total_len, |
1062 | !sender->user_port, &buf); | 1064 | sender->max_pkt, !sender->user_port, &buf); |
1063 | 1065 | ||
1064 | read_lock_bh(&tipc_net_lock); | 1066 | read_lock_bh(&tipc_net_lock); |
1065 | node = tipc_node_find(destaddr); | 1067 | node = tipc_node_find(destaddr); |
@@ -1104,7 +1106,8 @@ exit: | |||
1104 | goto again; | 1106 | goto again; |
1105 | 1107 | ||
1106 | return link_send_sections_long(sender, msg_sect, | 1108 | return link_send_sections_long(sender, msg_sect, |
1107 | num_sect, destaddr); | 1109 | num_sect, total_len, |
1110 | destaddr); | ||
1108 | } | 1111 | } |
1109 | tipc_node_unlock(node); | 1112 | tipc_node_unlock(node); |
1110 | } | 1113 | } |
@@ -1116,7 +1119,7 @@ exit: | |||
1116 | return tipc_reject_msg(buf, TIPC_ERR_NO_NODE); | 1119 | return tipc_reject_msg(buf, TIPC_ERR_NO_NODE); |
1117 | if (res >= 0) | 1120 | if (res >= 0) |
1118 | return tipc_port_reject_sections(sender, hdr, msg_sect, num_sect, | 1121 | return tipc_port_reject_sections(sender, hdr, msg_sect, num_sect, |
1119 | TIPC_ERR_NO_NODE); | 1122 | total_len, TIPC_ERR_NO_NODE); |
1120 | return res; | 1123 | return res; |
1121 | } | 1124 | } |
1122 | 1125 | ||
@@ -1137,12 +1140,13 @@ exit: | |||
1137 | static int link_send_sections_long(struct tipc_port *sender, | 1140 | static int link_send_sections_long(struct tipc_port *sender, |
1138 | struct iovec const *msg_sect, | 1141 | struct iovec const *msg_sect, |
1139 | u32 num_sect, | 1142 | u32 num_sect, |
1143 | unsigned int total_len, | ||
1140 | u32 destaddr) | 1144 | u32 destaddr) |
1141 | { | 1145 | { |
1142 | struct link *l_ptr; | 1146 | struct link *l_ptr; |
1143 | struct tipc_node *node; | 1147 | struct tipc_node *node; |
1144 | struct tipc_msg *hdr = &sender->phdr; | 1148 | struct tipc_msg *hdr = &sender->phdr; |
1145 | u32 dsz = msg_data_sz(hdr); | 1149 | u32 dsz = total_len; |
1146 | u32 max_pkt, fragm_sz, rest; | 1150 | u32 max_pkt, fragm_sz, rest; |
1147 | struct tipc_msg fragm_hdr; | 1151 | struct tipc_msg fragm_hdr; |
1148 | struct sk_buff *buf, *buf_chain, *prev; | 1152 | struct sk_buff *buf, *buf_chain, *prev; |
@@ -1269,7 +1273,7 @@ reject: | |||
1269 | buf_discard(buf_chain); | 1273 | buf_discard(buf_chain); |
1270 | } | 1274 | } |
1271 | return tipc_port_reject_sections(sender, hdr, msg_sect, num_sect, | 1275 | return tipc_port_reject_sections(sender, hdr, msg_sect, num_sect, |
1272 | TIPC_ERR_NO_NODE); | 1276 | total_len, TIPC_ERR_NO_NODE); |
1273 | } | 1277 | } |
1274 | 1278 | ||
1275 | /* Append whole chain to send queue: */ | 1279 | /* Append whole chain to send queue: */ |
diff --git a/net/tipc/link.h b/net/tipc/link.h index e6a30dbe1aaa..74fbecab1ea0 100644 --- a/net/tipc/link.h +++ b/net/tipc/link.h | |||
@@ -228,6 +228,7 @@ u32 tipc_link_get_max_pkt(u32 dest, u32 selector); | |||
228 | int tipc_link_send_sections_fast(struct tipc_port *sender, | 228 | int tipc_link_send_sections_fast(struct tipc_port *sender, |
229 | struct iovec const *msg_sect, | 229 | struct iovec const *msg_sect, |
230 | const u32 num_sect, | 230 | const u32 num_sect, |
231 | unsigned int total_len, | ||
231 | u32 destnode); | 232 | u32 destnode); |
232 | void tipc_link_recv_bundle(struct sk_buff *buf); | 233 | void tipc_link_recv_bundle(struct sk_buff *buf); |
233 | int tipc_link_recv_fragment(struct sk_buff **pending, | 234 | int tipc_link_recv_fragment(struct sk_buff **pending, |
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 6d92d17e7fb5..03e57bf92c73 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -68,20 +68,6 @@ void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, | |||
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 | * tipc_msg_build - create message using specified header and data | 71 | * tipc_msg_build - create message using specified header and data |
86 | * | 72 | * |
87 | * Note: Caller must not hold any locks in case copy_from_user() is interrupted! | 73 | * Note: Caller must not hold any locks in case copy_from_user() is interrupted! |
@@ -89,18 +75,13 @@ int tipc_msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect) | |||
89 | * Returns message data size or errno | 75 | * Returns message data size or errno |
90 | */ | 76 | */ |
91 | 77 | ||
92 | int tipc_msg_build(struct tipc_msg *hdr, | 78 | int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect, |
93 | struct iovec const *msg_sect, u32 num_sect, | 79 | u32 num_sect, unsigned int total_len, |
94 | int max_size, int usrmem, struct sk_buff **buf) | 80 | int max_size, int usrmem, struct sk_buff **buf) |
95 | { | 81 | { |
96 | int dsz, sz, hsz, pos, res, cnt; | 82 | int dsz, sz, hsz, pos, res, cnt; |
97 | 83 | ||
98 | dsz = tipc_msg_calc_data_size(msg_sect, num_sect); | 84 | dsz = total_len; |
99 | if (unlikely(dsz > TIPC_MAX_USER_MSG_SIZE)) { | ||
100 | *buf = NULL; | ||
101 | return -EINVAL; | ||
102 | } | ||
103 | |||
104 | pos = hsz = msg_hdr_sz(hdr); | 85 | pos = hsz = msg_hdr_sz(hdr); |
105 | sz = hsz + dsz; | 86 | sz = hsz + dsz; |
106 | msg_set_size(hdr, sz); | 87 | msg_set_size(hdr, sz); |
diff --git a/net/tipc/msg.h b/net/tipc/msg.h index 005b318fd328..8452454731fa 100644 --- a/net/tipc/msg.h +++ b/net/tipc/msg.h | |||
@@ -750,9 +750,8 @@ static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n) | |||
750 | u32 tipc_msg_tot_importance(struct tipc_msg *m); | 750 | u32 tipc_msg_tot_importance(struct tipc_msg *m); |
751 | void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, | 751 | void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, |
752 | u32 hsize, u32 destnode); | 752 | u32 hsize, u32 destnode); |
753 | int tipc_msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect); | 753 | int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect, |
754 | int tipc_msg_build(struct tipc_msg *hdr, | 754 | u32 num_sect, unsigned int total_len, |
755 | struct iovec const *msg_sect, u32 num_sect, | ||
756 | int max_size, int usrmem, struct sk_buff **buf); | 755 | int max_size, int usrmem, struct sk_buff **buf); |
757 | 756 | ||
758 | static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) | 757 | static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) |
diff --git a/net/tipc/port.c b/net/tipc/port.c index 9f2ff12cf436..c68dc956a423 100644 --- a/net/tipc/port.c +++ b/net/tipc/port.c | |||
@@ -74,7 +74,8 @@ static u32 port_peerport(struct tipc_port *p_ptr) | |||
74 | */ | 74 | */ |
75 | 75 | ||
76 | int tipc_multicast(u32 ref, struct tipc_name_seq const *seq, | 76 | int tipc_multicast(u32 ref, struct tipc_name_seq const *seq, |
77 | u32 num_sect, struct iovec const *msg_sect) | 77 | u32 num_sect, struct iovec const *msg_sect, |
78 | unsigned int total_len) | ||
78 | { | 79 | { |
79 | struct tipc_msg *hdr; | 80 | struct tipc_msg *hdr; |
80 | struct sk_buff *buf; | 81 | struct sk_buff *buf; |
@@ -98,7 +99,7 @@ int tipc_multicast(u32 ref, struct tipc_name_seq const *seq, | |||
98 | msg_set_namelower(hdr, seq->lower); | 99 | msg_set_namelower(hdr, seq->lower); |
99 | msg_set_nameupper(hdr, seq->upper); | 100 | msg_set_nameupper(hdr, seq->upper); |
100 | msg_set_hdr_sz(hdr, MCAST_H_SIZE); | 101 | msg_set_hdr_sz(hdr, MCAST_H_SIZE); |
101 | res = tipc_msg_build(hdr, msg_sect, num_sect, MAX_MSG_SIZE, | 102 | res = tipc_msg_build(hdr, msg_sect, num_sect, total_len, MAX_MSG_SIZE, |
102 | !oport->user_port, &buf); | 103 | !oport->user_port, &buf); |
103 | if (unlikely(!buf)) | 104 | if (unlikely(!buf)) |
104 | return res; | 105 | return res; |
@@ -418,12 +419,12 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err) | |||
418 | 419 | ||
419 | int tipc_port_reject_sections(struct tipc_port *p_ptr, struct tipc_msg *hdr, | 420 | int tipc_port_reject_sections(struct tipc_port *p_ptr, struct tipc_msg *hdr, |
420 | struct iovec const *msg_sect, u32 num_sect, | 421 | struct iovec const *msg_sect, u32 num_sect, |
421 | int err) | 422 | unsigned int total_len, int err) |
422 | { | 423 | { |
423 | struct sk_buff *buf; | 424 | struct sk_buff *buf; |
424 | int res; | 425 | int res; |
425 | 426 | ||
426 | res = tipc_msg_build(hdr, msg_sect, num_sect, MAX_MSG_SIZE, | 427 | res = tipc_msg_build(hdr, msg_sect, num_sect, total_len, MAX_MSG_SIZE, |
427 | !p_ptr->user_port, &buf); | 428 | !p_ptr->user_port, &buf); |
428 | if (!buf) | 429 | if (!buf) |
429 | return res; | 430 | return res; |
@@ -1163,12 +1164,13 @@ int tipc_shutdown(u32 ref) | |||
1163 | */ | 1164 | */ |
1164 | 1165 | ||
1165 | static int tipc_port_recv_sections(struct tipc_port *sender, unsigned int num_sect, | 1166 | static int tipc_port_recv_sections(struct tipc_port *sender, unsigned int num_sect, |
1166 | struct iovec const *msg_sect) | 1167 | struct iovec const *msg_sect, |
1168 | unsigned int total_len) | ||
1167 | { | 1169 | { |
1168 | struct sk_buff *buf; | 1170 | struct sk_buff *buf; |
1169 | int res; | 1171 | int res; |
1170 | 1172 | ||
1171 | res = tipc_msg_build(&sender->phdr, msg_sect, num_sect, | 1173 | res = tipc_msg_build(&sender->phdr, msg_sect, num_sect, total_len, |
1172 | MAX_MSG_SIZE, !sender->user_port, &buf); | 1174 | MAX_MSG_SIZE, !sender->user_port, &buf); |
1173 | if (likely(buf)) | 1175 | if (likely(buf)) |
1174 | tipc_port_recv_msg(buf); | 1176 | tipc_port_recv_msg(buf); |
@@ -1179,7 +1181,8 @@ static int tipc_port_recv_sections(struct tipc_port *sender, unsigned int num_se | |||
1179 | * tipc_send - send message sections on connection | 1181 | * tipc_send - send message sections on connection |
1180 | */ | 1182 | */ |
1181 | 1183 | ||
1182 | int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect) | 1184 | int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect, |
1185 | unsigned int total_len) | ||
1183 | { | 1186 | { |
1184 | struct tipc_port *p_ptr; | 1187 | struct tipc_port *p_ptr; |
1185 | u32 destnode; | 1188 | u32 destnode; |
@@ -1194,9 +1197,10 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect) | |||
1194 | destnode = port_peernode(p_ptr); | 1197 | destnode = port_peernode(p_ptr); |
1195 | if (likely(destnode != tipc_own_addr)) | 1198 | if (likely(destnode != tipc_own_addr)) |
1196 | res = tipc_link_send_sections_fast(p_ptr, msg_sect, num_sect, | 1199 | res = tipc_link_send_sections_fast(p_ptr, msg_sect, num_sect, |
1197 | destnode); | 1200 | total_len, destnode); |
1198 | else | 1201 | else |
1199 | res = tipc_port_recv_sections(p_ptr, num_sect, msg_sect); | 1202 | res = tipc_port_recv_sections(p_ptr, num_sect, msg_sect, |
1203 | total_len); | ||
1200 | 1204 | ||
1201 | if (likely(res != -ELINKCONG)) { | 1205 | if (likely(res != -ELINKCONG)) { |
1202 | p_ptr->congested = 0; | 1206 | p_ptr->congested = 0; |
@@ -1207,8 +1211,7 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect) | |||
1207 | } | 1211 | } |
1208 | if (port_unreliable(p_ptr)) { | 1212 | if (port_unreliable(p_ptr)) { |
1209 | p_ptr->congested = 0; | 1213 | p_ptr->congested = 0; |
1210 | /* Just calculate msg length and return */ | 1214 | return total_len; |
1211 | return tipc_msg_calc_data_size(msg_sect, num_sect); | ||
1212 | } | 1215 | } |
1213 | return -ELINKCONG; | 1216 | return -ELINKCONG; |
1214 | } | 1217 | } |
@@ -1218,7 +1221,8 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect) | |||
1218 | */ | 1221 | */ |
1219 | 1222 | ||
1220 | int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain, | 1223 | int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain, |
1221 | unsigned int num_sect, struct iovec const *msg_sect) | 1224 | unsigned int num_sect, struct iovec const *msg_sect, |
1225 | unsigned int total_len) | ||
1222 | { | 1226 | { |
1223 | struct tipc_port *p_ptr; | 1227 | struct tipc_port *p_ptr; |
1224 | struct tipc_msg *msg; | 1228 | struct tipc_msg *msg; |
@@ -1245,23 +1249,23 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain, | |||
1245 | if (likely(destport)) { | 1249 | if (likely(destport)) { |
1246 | if (likely(destnode == tipc_own_addr)) | 1250 | if (likely(destnode == tipc_own_addr)) |
1247 | res = tipc_port_recv_sections(p_ptr, num_sect, | 1251 | res = tipc_port_recv_sections(p_ptr, num_sect, |
1248 | msg_sect); | 1252 | msg_sect, total_len); |
1249 | else | 1253 | else |
1250 | res = tipc_link_send_sections_fast(p_ptr, msg_sect, | 1254 | res = tipc_link_send_sections_fast(p_ptr, msg_sect, |
1251 | num_sect, destnode); | 1255 | num_sect, total_len, |
1256 | destnode); | ||
1252 | if (likely(res != -ELINKCONG)) { | 1257 | if (likely(res != -ELINKCONG)) { |
1253 | if (res > 0) | 1258 | if (res > 0) |
1254 | p_ptr->sent++; | 1259 | p_ptr->sent++; |
1255 | return res; | 1260 | return res; |
1256 | } | 1261 | } |
1257 | if (port_unreliable(p_ptr)) { | 1262 | if (port_unreliable(p_ptr)) { |
1258 | /* Just calculate msg length and return */ | 1263 | return total_len; |
1259 | return tipc_msg_calc_data_size(msg_sect, num_sect); | ||
1260 | } | 1264 | } |
1261 | return -ELINKCONG; | 1265 | return -ELINKCONG; |
1262 | } | 1266 | } |
1263 | return tipc_port_reject_sections(p_ptr, msg, msg_sect, num_sect, | 1267 | return tipc_port_reject_sections(p_ptr, msg, msg_sect, num_sect, |
1264 | TIPC_ERR_NO_NAME); | 1268 | total_len, TIPC_ERR_NO_NAME); |
1265 | } | 1269 | } |
1266 | 1270 | ||
1267 | /** | 1271 | /** |
@@ -1269,7 +1273,8 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain, | |||
1269 | */ | 1273 | */ |
1270 | 1274 | ||
1271 | int tipc_send2port(u32 ref, struct tipc_portid const *dest, | 1275 | int tipc_send2port(u32 ref, struct tipc_portid const *dest, |
1272 | unsigned int num_sect, struct iovec const *msg_sect) | 1276 | unsigned int num_sect, struct iovec const *msg_sect, |
1277 | unsigned int total_len) | ||
1273 | { | 1278 | { |
1274 | struct tipc_port *p_ptr; | 1279 | struct tipc_port *p_ptr; |
1275 | struct tipc_msg *msg; | 1280 | struct tipc_msg *msg; |
@@ -1289,18 +1294,18 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest, | |||
1289 | msg_set_hdr_sz(msg, DIR_MSG_H_SIZE); | 1294 | msg_set_hdr_sz(msg, DIR_MSG_H_SIZE); |
1290 | 1295 | ||
1291 | if (dest->node == tipc_own_addr) | 1296 | if (dest->node == tipc_own_addr) |
1292 | res = tipc_port_recv_sections(p_ptr, num_sect, msg_sect); | 1297 | res = tipc_port_recv_sections(p_ptr, num_sect, msg_sect, |
1298 | total_len); | ||
1293 | else | 1299 | else |
1294 | res = tipc_link_send_sections_fast(p_ptr, msg_sect, num_sect, | 1300 | res = tipc_link_send_sections_fast(p_ptr, msg_sect, num_sect, |
1295 | dest->node); | 1301 | total_len, dest->node); |
1296 | if (likely(res != -ELINKCONG)) { | 1302 | if (likely(res != -ELINKCONG)) { |
1297 | if (res > 0) | 1303 | if (res > 0) |
1298 | p_ptr->sent++; | 1304 | p_ptr->sent++; |
1299 | return res; | 1305 | return res; |
1300 | } | 1306 | } |
1301 | if (port_unreliable(p_ptr)) { | 1307 | if (port_unreliable(p_ptr)) { |
1302 | /* Just calculate msg length and return */ | 1308 | return total_len; |
1303 | return tipc_msg_calc_data_size(msg_sect, num_sect); | ||
1304 | } | 1309 | } |
1305 | return -ELINKCONG; | 1310 | return -ELINKCONG; |
1306 | } | 1311 | } |
diff --git a/net/tipc/port.h b/net/tipc/port.h index 87b9424ae0ec..b9aa34195aec 100644 --- a/net/tipc/port.h +++ b/net/tipc/port.h | |||
@@ -205,23 +205,27 @@ int tipc_disconnect_port(struct tipc_port *tp_ptr); | |||
205 | /* | 205 | /* |
206 | * TIPC messaging routines | 206 | * TIPC messaging routines |
207 | */ | 207 | */ |
208 | int tipc_send(u32 portref, unsigned int num_sect, struct iovec const *msg_sect); | 208 | int tipc_send(u32 portref, unsigned int num_sect, struct iovec const *msg_sect, |
209 | unsigned int total_len); | ||
209 | 210 | ||
210 | int tipc_send2name(u32 portref, struct tipc_name const *name, u32 domain, | 211 | int tipc_send2name(u32 portref, struct tipc_name const *name, u32 domain, |
211 | unsigned int num_sect, struct iovec const *msg_sect); | 212 | unsigned int num_sect, struct iovec const *msg_sect, |
213 | unsigned int total_len); | ||
212 | 214 | ||
213 | int tipc_send2port(u32 portref, struct tipc_portid const *dest, | 215 | int tipc_send2port(u32 portref, struct tipc_portid const *dest, |
214 | unsigned int num_sect, struct iovec const *msg_sect); | 216 | unsigned int num_sect, struct iovec const *msg_sect, |
217 | unsigned int total_len); | ||
215 | 218 | ||
216 | int tipc_send_buf2port(u32 portref, struct tipc_portid const *dest, | 219 | int tipc_send_buf2port(u32 portref, struct tipc_portid const *dest, |
217 | struct sk_buff *buf, unsigned int dsz); | 220 | struct sk_buff *buf, unsigned int dsz); |
218 | 221 | ||
219 | int tipc_multicast(u32 portref, struct tipc_name_seq const *seq, | 222 | int tipc_multicast(u32 portref, struct tipc_name_seq const *seq, |
220 | unsigned int section_count, struct iovec const *msg); | 223 | unsigned int section_count, struct iovec const *msg, |
224 | unsigned int total_len); | ||
221 | 225 | ||
222 | int tipc_port_reject_sections(struct tipc_port *p_ptr, struct tipc_msg *hdr, | 226 | int tipc_port_reject_sections(struct tipc_port *p_ptr, struct tipc_msg *hdr, |
223 | struct iovec const *msg_sect, u32 num_sect, | 227 | struct iovec const *msg_sect, u32 num_sect, |
224 | int err); | 228 | unsigned int total_len, int err); |
225 | struct sk_buff *tipc_port_get_ports(void); | 229 | struct sk_buff *tipc_port_get_ports(void); |
226 | void tipc_port_recv_proto_msg(struct sk_buff *buf); | 230 | void tipc_port_recv_proto_msg(struct sk_buff *buf); |
227 | void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp); | 231 | void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp); |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index e1c791798ba1..338837396642 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -576,12 +576,14 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, | |||
576 | &dest->addr.name.name, | 576 | &dest->addr.name.name, |
577 | dest->addr.name.domain, | 577 | dest->addr.name.domain, |
578 | m->msg_iovlen, | 578 | m->msg_iovlen, |
579 | m->msg_iov); | 579 | m->msg_iov, |
580 | total_len); | ||
580 | } else if (dest->addrtype == TIPC_ADDR_ID) { | 581 | } else if (dest->addrtype == TIPC_ADDR_ID) { |
581 | res = tipc_send2port(tport->ref, | 582 | res = tipc_send2port(tport->ref, |
582 | &dest->addr.id, | 583 | &dest->addr.id, |
583 | m->msg_iovlen, | 584 | m->msg_iovlen, |
584 | m->msg_iov); | 585 | m->msg_iov, |
586 | total_len); | ||
585 | } else if (dest->addrtype == TIPC_ADDR_MCAST) { | 587 | } else if (dest->addrtype == TIPC_ADDR_MCAST) { |
586 | if (needs_conn) { | 588 | if (needs_conn) { |
587 | res = -EOPNOTSUPP; | 589 | res = -EOPNOTSUPP; |
@@ -593,7 +595,8 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, | |||
593 | res = tipc_multicast(tport->ref, | 595 | res = tipc_multicast(tport->ref, |
594 | &dest->addr.nameseq, | 596 | &dest->addr.nameseq, |
595 | m->msg_iovlen, | 597 | m->msg_iovlen, |
596 | m->msg_iov); | 598 | m->msg_iov, |
599 | total_len); | ||
597 | } | 600 | } |
598 | if (likely(res != -ELINKCONG)) { | 601 | if (likely(res != -ELINKCONG)) { |
599 | if (needs_conn && (res >= 0)) | 602 | if (needs_conn && (res >= 0)) |
@@ -659,7 +662,8 @@ static int send_packet(struct kiocb *iocb, struct socket *sock, | |||
659 | break; | 662 | break; |
660 | } | 663 | } |
661 | 664 | ||
662 | res = tipc_send(tport->ref, m->msg_iovlen, m->msg_iov); | 665 | res = tipc_send(tport->ref, m->msg_iovlen, m->msg_iov, |
666 | total_len); | ||
663 | if (likely(res != -ELINKCONG)) | 667 | if (likely(res != -ELINKCONG)) |
664 | break; | 668 | break; |
665 | if (m->msg_flags & MSG_DONTWAIT) { | 669 | if (m->msg_flags & MSG_DONTWAIT) { |
@@ -766,7 +770,7 @@ static int send_stream(struct kiocb *iocb, struct socket *sock, | |||
766 | bytes_to_send = curr_left; | 770 | bytes_to_send = curr_left; |
767 | my_iov.iov_base = curr_start; | 771 | my_iov.iov_base = curr_start; |
768 | my_iov.iov_len = bytes_to_send; | 772 | my_iov.iov_len = bytes_to_send; |
769 | res = send_packet(NULL, sock, &my_msg, 0); | 773 | res = send_packet(NULL, sock, &my_msg, bytes_to_send); |
770 | if (res < 0) { | 774 | if (res < 0) { |
771 | if (bytes_sent) | 775 | if (bytes_sent) |
772 | res = bytes_sent; | 776 | res = bytes_sent; |
diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c index aae9eae13404..6cf726863485 100644 --- a/net/tipc/subscr.c +++ b/net/tipc/subscr.c | |||
@@ -109,7 +109,7 @@ static void subscr_send_event(struct subscription *sub, | |||
109 | sub->evt.found_upper = htohl(found_upper, sub->swap); | 109 | sub->evt.found_upper = htohl(found_upper, sub->swap); |
110 | sub->evt.port.ref = htohl(port_ref, sub->swap); | 110 | sub->evt.port.ref = htohl(port_ref, sub->swap); |
111 | sub->evt.port.node = htohl(node, sub->swap); | 111 | sub->evt.port.node = htohl(node, sub->swap); |
112 | tipc_send(sub->server_ref, 1, &msg_sect); | 112 | tipc_send(sub->server_ref, 1, &msg_sect, msg_sect.iov_len); |
113 | } | 113 | } |
114 | 114 | ||
115 | /** | 115 | /** |
@@ -521,7 +521,7 @@ static void subscr_named_msg_event(void *usr_handle, | |||
521 | 521 | ||
522 | /* Send an ACK- to complete connection handshaking */ | 522 | /* Send an ACK- to complete connection handshaking */ |
523 | 523 | ||
524 | tipc_send(server_port_ref, 0, NULL); | 524 | tipc_send(server_port_ref, 0, NULL, 0); |
525 | 525 | ||
526 | /* Handle optional subscription request */ | 526 | /* Handle optional subscription request */ |
527 | 527 | ||