diff options
Diffstat (limited to 'net/tipc/port.c')
-rw-r--r-- | net/tipc/port.c | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/net/tipc/port.c b/net/tipc/port.c index 6ff78f9c7d65..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; |
@@ -91,11 +92,14 @@ int tipc_multicast(u32 ref, struct tipc_name_seq const *seq, | |||
91 | 92 | ||
92 | hdr = &oport->phdr; | 93 | hdr = &oport->phdr; |
93 | msg_set_type(hdr, TIPC_MCAST_MSG); | 94 | msg_set_type(hdr, TIPC_MCAST_MSG); |
95 | msg_set_lookup_scope(hdr, TIPC_CLUSTER_SCOPE); | ||
96 | msg_set_destport(hdr, 0); | ||
97 | msg_set_destnode(hdr, 0); | ||
94 | msg_set_nametype(hdr, seq->type); | 98 | msg_set_nametype(hdr, seq->type); |
95 | msg_set_namelower(hdr, seq->lower); | 99 | msg_set_namelower(hdr, seq->lower); |
96 | msg_set_nameupper(hdr, seq->upper); | 100 | msg_set_nameupper(hdr, seq->upper); |
97 | msg_set_hdr_sz(hdr, MCAST_H_SIZE); | 101 | msg_set_hdr_sz(hdr, MCAST_H_SIZE); |
98 | 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, |
99 | !oport->user_port, &buf); | 103 | !oport->user_port, &buf); |
100 | if (unlikely(!buf)) | 104 | if (unlikely(!buf)) |
101 | return res; | 105 | return res; |
@@ -161,6 +165,7 @@ void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp) | |||
161 | /* Deliver a copy of message to each destination port */ | 165 | /* Deliver a copy of message to each destination port */ |
162 | 166 | ||
163 | if (dp->count != 0) { | 167 | if (dp->count != 0) { |
168 | msg_set_destnode(msg, tipc_own_addr); | ||
164 | if (dp->count == 1) { | 169 | if (dp->count == 1) { |
165 | msg_set_destport(msg, dp->ports[0]); | 170 | msg_set_destport(msg, dp->ports[0]); |
166 | tipc_port_recv_msg(buf); | 171 | tipc_port_recv_msg(buf); |
@@ -414,12 +419,12 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err) | |||
414 | 419 | ||
415 | 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, |
416 | struct iovec const *msg_sect, u32 num_sect, | 421 | struct iovec const *msg_sect, u32 num_sect, |
417 | int err) | 422 | unsigned int total_len, int err) |
418 | { | 423 | { |
419 | struct sk_buff *buf; | 424 | struct sk_buff *buf; |
420 | int res; | 425 | int res; |
421 | 426 | ||
422 | 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, |
423 | !p_ptr->user_port, &buf); | 428 | !p_ptr->user_port, &buf); |
424 | if (!buf) | 429 | if (!buf) |
425 | return res; | 430 | return res; |
@@ -1065,6 +1070,7 @@ int tipc_connect2port(u32 ref, struct tipc_portid const *peer) | |||
1065 | msg_set_orignode(msg, tipc_own_addr); | 1070 | msg_set_orignode(msg, tipc_own_addr); |
1066 | msg_set_origport(msg, p_ptr->ref); | 1071 | msg_set_origport(msg, p_ptr->ref); |
1067 | msg_set_type(msg, TIPC_CONN_MSG); | 1072 | msg_set_type(msg, TIPC_CONN_MSG); |
1073 | msg_set_lookup_scope(msg, 0); | ||
1068 | msg_set_hdr_sz(msg, SHORT_H_SIZE); | 1074 | msg_set_hdr_sz(msg, SHORT_H_SIZE); |
1069 | 1075 | ||
1070 | p_ptr->probing_interval = PROBING_INTERVAL; | 1076 | p_ptr->probing_interval = PROBING_INTERVAL; |
@@ -1158,12 +1164,13 @@ int tipc_shutdown(u32 ref) | |||
1158 | */ | 1164 | */ |
1159 | 1165 | ||
1160 | 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, |
1161 | struct iovec const *msg_sect) | 1167 | struct iovec const *msg_sect, |
1168 | unsigned int total_len) | ||
1162 | { | 1169 | { |
1163 | struct sk_buff *buf; | 1170 | struct sk_buff *buf; |
1164 | int res; | 1171 | int res; |
1165 | 1172 | ||
1166 | res = tipc_msg_build(&sender->phdr, msg_sect, num_sect, | 1173 | res = tipc_msg_build(&sender->phdr, msg_sect, num_sect, total_len, |
1167 | MAX_MSG_SIZE, !sender->user_port, &buf); | 1174 | MAX_MSG_SIZE, !sender->user_port, &buf); |
1168 | if (likely(buf)) | 1175 | if (likely(buf)) |
1169 | tipc_port_recv_msg(buf); | 1176 | tipc_port_recv_msg(buf); |
@@ -1174,7 +1181,8 @@ static int tipc_port_recv_sections(struct tipc_port *sender, unsigned int num_se | |||
1174 | * tipc_send - send message sections on connection | 1181 | * tipc_send - send message sections on connection |
1175 | */ | 1182 | */ |
1176 | 1183 | ||
1177 | 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) | ||
1178 | { | 1186 | { |
1179 | struct tipc_port *p_ptr; | 1187 | struct tipc_port *p_ptr; |
1180 | u32 destnode; | 1188 | u32 destnode; |
@@ -1189,9 +1197,10 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect) | |||
1189 | destnode = port_peernode(p_ptr); | 1197 | destnode = port_peernode(p_ptr); |
1190 | if (likely(destnode != tipc_own_addr)) | 1198 | if (likely(destnode != tipc_own_addr)) |
1191 | 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, |
1192 | destnode); | 1200 | total_len, destnode); |
1193 | else | 1201 | else |
1194 | 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); | ||
1195 | 1204 | ||
1196 | if (likely(res != -ELINKCONG)) { | 1205 | if (likely(res != -ELINKCONG)) { |
1197 | p_ptr->congested = 0; | 1206 | p_ptr->congested = 0; |
@@ -1202,8 +1211,7 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect) | |||
1202 | } | 1211 | } |
1203 | if (port_unreliable(p_ptr)) { | 1212 | if (port_unreliable(p_ptr)) { |
1204 | p_ptr->congested = 0; | 1213 | p_ptr->congested = 0; |
1205 | /* Just calculate msg length and return */ | 1214 | return total_len; |
1206 | return tipc_msg_calc_data_size(msg_sect, num_sect); | ||
1207 | } | 1215 | } |
1208 | return -ELINKCONG; | 1216 | return -ELINKCONG; |
1209 | } | 1217 | } |
@@ -1213,7 +1221,8 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect) | |||
1213 | */ | 1221 | */ |
1214 | 1222 | ||
1215 | 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, |
1216 | unsigned int num_sect, struct iovec const *msg_sect) | 1224 | unsigned int num_sect, struct iovec const *msg_sect, |
1225 | unsigned int total_len) | ||
1217 | { | 1226 | { |
1218 | struct tipc_port *p_ptr; | 1227 | struct tipc_port *p_ptr; |
1219 | struct tipc_msg *msg; | 1228 | struct tipc_msg *msg; |
@@ -1240,23 +1249,23 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain, | |||
1240 | if (likely(destport)) { | 1249 | if (likely(destport)) { |
1241 | if (likely(destnode == tipc_own_addr)) | 1250 | if (likely(destnode == tipc_own_addr)) |
1242 | res = tipc_port_recv_sections(p_ptr, num_sect, | 1251 | res = tipc_port_recv_sections(p_ptr, num_sect, |
1243 | msg_sect); | 1252 | msg_sect, total_len); |
1244 | else | 1253 | else |
1245 | res = tipc_link_send_sections_fast(p_ptr, msg_sect, | 1254 | res = tipc_link_send_sections_fast(p_ptr, msg_sect, |
1246 | num_sect, destnode); | 1255 | num_sect, total_len, |
1256 | destnode); | ||
1247 | if (likely(res != -ELINKCONG)) { | 1257 | if (likely(res != -ELINKCONG)) { |
1248 | if (res > 0) | 1258 | if (res > 0) |
1249 | p_ptr->sent++; | 1259 | p_ptr->sent++; |
1250 | return res; | 1260 | return res; |
1251 | } | 1261 | } |
1252 | if (port_unreliable(p_ptr)) { | 1262 | if (port_unreliable(p_ptr)) { |
1253 | /* Just calculate msg length and return */ | 1263 | return total_len; |
1254 | return tipc_msg_calc_data_size(msg_sect, num_sect); | ||
1255 | } | 1264 | } |
1256 | return -ELINKCONG; | 1265 | return -ELINKCONG; |
1257 | } | 1266 | } |
1258 | 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, |
1259 | TIPC_ERR_NO_NAME); | 1268 | total_len, TIPC_ERR_NO_NAME); |
1260 | } | 1269 | } |
1261 | 1270 | ||
1262 | /** | 1271 | /** |
@@ -1264,7 +1273,8 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain, | |||
1264 | */ | 1273 | */ |
1265 | 1274 | ||
1266 | int tipc_send2port(u32 ref, struct tipc_portid const *dest, | 1275 | int tipc_send2port(u32 ref, struct tipc_portid const *dest, |
1267 | unsigned int num_sect, struct iovec const *msg_sect) | 1276 | unsigned int num_sect, struct iovec const *msg_sect, |
1277 | unsigned int total_len) | ||
1268 | { | 1278 | { |
1269 | struct tipc_port *p_ptr; | 1279 | struct tipc_port *p_ptr; |
1270 | struct tipc_msg *msg; | 1280 | struct tipc_msg *msg; |
@@ -1276,6 +1286,7 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest, | |||
1276 | 1286 | ||
1277 | msg = &p_ptr->phdr; | 1287 | msg = &p_ptr->phdr; |
1278 | msg_set_type(msg, TIPC_DIRECT_MSG); | 1288 | msg_set_type(msg, TIPC_DIRECT_MSG); |
1289 | msg_set_lookup_scope(msg, 0); | ||
1279 | msg_set_orignode(msg, tipc_own_addr); | 1290 | msg_set_orignode(msg, tipc_own_addr); |
1280 | msg_set_origport(msg, ref); | 1291 | msg_set_origport(msg, ref); |
1281 | msg_set_destnode(msg, dest->node); | 1292 | msg_set_destnode(msg, dest->node); |
@@ -1283,18 +1294,18 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest, | |||
1283 | msg_set_hdr_sz(msg, DIR_MSG_H_SIZE); | 1294 | msg_set_hdr_sz(msg, DIR_MSG_H_SIZE); |
1284 | 1295 | ||
1285 | if (dest->node == tipc_own_addr) | 1296 | if (dest->node == tipc_own_addr) |
1286 | 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); | ||
1287 | else | 1299 | else |
1288 | 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, |
1289 | dest->node); | 1301 | total_len, dest->node); |
1290 | if (likely(res != -ELINKCONG)) { | 1302 | if (likely(res != -ELINKCONG)) { |
1291 | if (res > 0) | 1303 | if (res > 0) |
1292 | p_ptr->sent++; | 1304 | p_ptr->sent++; |
1293 | return res; | 1305 | return res; |
1294 | } | 1306 | } |
1295 | if (port_unreliable(p_ptr)) { | 1307 | if (port_unreliable(p_ptr)) { |
1296 | /* Just calculate msg length and return */ | 1308 | return total_len; |
1297 | return tipc_msg_calc_data_size(msg_sect, num_sect); | ||
1298 | } | 1309 | } |
1299 | return -ELINKCONG; | 1310 | return -ELINKCONG; |
1300 | } | 1311 | } |