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 | } |
