diff options
Diffstat (limited to 'net/tipc/port.c')
-rw-r--r-- | net/tipc/port.c | 234 |
1 files changed, 23 insertions, 211 deletions
diff --git a/net/tipc/port.c b/net/tipc/port.c index 5c4285b2d555..82092eaa1536 100644 --- a/net/tipc/port.c +++ b/net/tipc/port.c | |||
@@ -293,34 +293,6 @@ int tipc_deleteport(u32 ref) | |||
293 | return 0; | 293 | return 0; |
294 | } | 294 | } |
295 | 295 | ||
296 | /** | ||
297 | * tipc_get_port() - return port associated with 'ref' | ||
298 | * | ||
299 | * Note: Port is not locked. | ||
300 | */ | ||
301 | |||
302 | struct tipc_port *tipc_get_port(const u32 ref) | ||
303 | { | ||
304 | return (struct tipc_port *)tipc_ref_deref(ref); | ||
305 | } | ||
306 | |||
307 | /** | ||
308 | * tipc_get_handle - return user handle associated to port 'ref' | ||
309 | */ | ||
310 | |||
311 | void *tipc_get_handle(const u32 ref) | ||
312 | { | ||
313 | struct port *p_ptr; | ||
314 | void * handle; | ||
315 | |||
316 | p_ptr = tipc_port_lock(ref); | ||
317 | if (!p_ptr) | ||
318 | return NULL; | ||
319 | handle = p_ptr->publ.usr_handle; | ||
320 | tipc_port_unlock(p_ptr); | ||
321 | return handle; | ||
322 | } | ||
323 | |||
324 | static int port_unreliable(struct port *p_ptr) | 296 | static int port_unreliable(struct port *p_ptr) |
325 | { | 297 | { |
326 | return msg_src_droppable(&p_ptr->publ.phdr); | 298 | return msg_src_droppable(&p_ptr->publ.phdr); |
@@ -392,7 +364,7 @@ static struct sk_buff *port_build_proto_msg(u32 destport, u32 destnode, | |||
392 | struct sk_buff *buf; | 364 | struct sk_buff *buf; |
393 | struct tipc_msg *msg; | 365 | struct tipc_msg *msg; |
394 | 366 | ||
395 | buf = buf_acquire(LONG_H_SIZE); | 367 | buf = tipc_buf_acquire(LONG_H_SIZE); |
396 | if (buf) { | 368 | if (buf) { |
397 | msg = buf_msg(buf); | 369 | msg = buf_msg(buf); |
398 | tipc_msg_init(msg, usr, type, LONG_H_SIZE, destnode); | 370 | tipc_msg_init(msg, usr, type, LONG_H_SIZE, destnode); |
@@ -433,7 +405,7 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err) | |||
433 | hdr_sz = MCAST_H_SIZE; | 405 | hdr_sz = MCAST_H_SIZE; |
434 | else | 406 | else |
435 | hdr_sz = LONG_H_SIZE; | 407 | hdr_sz = LONG_H_SIZE; |
436 | rbuf = buf_acquire(data_sz + hdr_sz); | 408 | rbuf = tipc_buf_acquire(data_sz + hdr_sz); |
437 | if (rbuf == NULL) { | 409 | if (rbuf == NULL) { |
438 | buf_discard(buf); | 410 | buf_discard(buf); |
439 | return data_sz; | 411 | return data_sz; |
@@ -1242,50 +1214,13 @@ int tipc_shutdown(u32 ref) | |||
1242 | return tipc_disconnect(ref); | 1214 | return tipc_disconnect(ref); |
1243 | } | 1215 | } |
1244 | 1216 | ||
1245 | int tipc_isconnected(u32 ref, int *isconnected) | ||
1246 | { | ||
1247 | struct port *p_ptr; | ||
1248 | |||
1249 | p_ptr = tipc_port_lock(ref); | ||
1250 | if (!p_ptr) | ||
1251 | return -EINVAL; | ||
1252 | *isconnected = p_ptr->publ.connected; | ||
1253 | tipc_port_unlock(p_ptr); | ||
1254 | return 0; | ||
1255 | } | ||
1256 | |||
1257 | int tipc_peer(u32 ref, struct tipc_portid *peer) | ||
1258 | { | ||
1259 | struct port *p_ptr; | ||
1260 | int res; | ||
1261 | |||
1262 | p_ptr = tipc_port_lock(ref); | ||
1263 | if (!p_ptr) | ||
1264 | return -EINVAL; | ||
1265 | if (p_ptr->publ.connected) { | ||
1266 | peer->ref = port_peerport(p_ptr); | ||
1267 | peer->node = port_peernode(p_ptr); | ||
1268 | res = 0; | ||
1269 | } else | ||
1270 | res = -ENOTCONN; | ||
1271 | tipc_port_unlock(p_ptr); | ||
1272 | return res; | ||
1273 | } | ||
1274 | |||
1275 | int tipc_ref_valid(u32 ref) | ||
1276 | { | ||
1277 | /* Works irrespective of type */ | ||
1278 | return !!tipc_ref_deref(ref); | ||
1279 | } | ||
1280 | |||
1281 | |||
1282 | /* | 1217 | /* |
1283 | * tipc_port_recv_sections(): Concatenate and deliver sectioned | 1218 | * tipc_port_recv_sections(): Concatenate and deliver sectioned |
1284 | * message for this node. | 1219 | * message for this node. |
1285 | */ | 1220 | */ |
1286 | 1221 | ||
1287 | int tipc_port_recv_sections(struct port *sender, unsigned int num_sect, | 1222 | static int tipc_port_recv_sections(struct port *sender, unsigned int num_sect, |
1288 | struct iovec const *msg_sect) | 1223 | struct iovec const *msg_sect) |
1289 | { | 1224 | { |
1290 | struct sk_buff *buf; | 1225 | struct sk_buff *buf; |
1291 | int res; | 1226 | int res; |
@@ -1336,65 +1271,16 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect) | |||
1336 | } | 1271 | } |
1337 | 1272 | ||
1338 | /** | 1273 | /** |
1339 | * tipc_send_buf - send message buffer on connection | ||
1340 | */ | ||
1341 | |||
1342 | int tipc_send_buf(u32 ref, struct sk_buff *buf, unsigned int dsz) | ||
1343 | { | ||
1344 | struct port *p_ptr; | ||
1345 | struct tipc_msg *msg; | ||
1346 | u32 destnode; | ||
1347 | u32 hsz; | ||
1348 | u32 sz; | ||
1349 | u32 res; | ||
1350 | |||
1351 | p_ptr = tipc_port_deref(ref); | ||
1352 | if (!p_ptr || !p_ptr->publ.connected) | ||
1353 | return -EINVAL; | ||
1354 | |||
1355 | msg = &p_ptr->publ.phdr; | ||
1356 | hsz = msg_hdr_sz(msg); | ||
1357 | sz = hsz + dsz; | ||
1358 | msg_set_size(msg, sz); | ||
1359 | if (skb_cow(buf, hsz)) | ||
1360 | return -ENOMEM; | ||
1361 | |||
1362 | skb_push(buf, hsz); | ||
1363 | skb_copy_to_linear_data(buf, msg, hsz); | ||
1364 | destnode = msg_destnode(msg); | ||
1365 | p_ptr->publ.congested = 1; | ||
1366 | if (!tipc_port_congested(p_ptr)) { | ||
1367 | if (likely(destnode != tipc_own_addr)) | ||
1368 | res = tipc_send_buf_fast(buf, destnode); | ||
1369 | else { | ||
1370 | tipc_port_recv_msg(buf); | ||
1371 | res = sz; | ||
1372 | } | ||
1373 | if (likely(res != -ELINKCONG)) { | ||
1374 | port_incr_out_seqno(p_ptr); | ||
1375 | p_ptr->sent++; | ||
1376 | p_ptr->publ.congested = 0; | ||
1377 | return res; | ||
1378 | } | ||
1379 | } | ||
1380 | if (port_unreliable(p_ptr)) { | ||
1381 | p_ptr->publ.congested = 0; | ||
1382 | return dsz; | ||
1383 | } | ||
1384 | return -ELINKCONG; | ||
1385 | } | ||
1386 | |||
1387 | /** | ||
1388 | * tipc_forward2name - forward message sections to port name | 1274 | * tipc_forward2name - forward message sections to port name |
1389 | */ | 1275 | */ |
1390 | 1276 | ||
1391 | int tipc_forward2name(u32 ref, | 1277 | static int tipc_forward2name(u32 ref, |
1392 | struct tipc_name const *name, | 1278 | struct tipc_name const *name, |
1393 | u32 domain, | 1279 | u32 domain, |
1394 | u32 num_sect, | 1280 | u32 num_sect, |
1395 | struct iovec const *msg_sect, | 1281 | struct iovec const *msg_sect, |
1396 | struct tipc_portid const *orig, | 1282 | struct tipc_portid const *orig, |
1397 | unsigned int importance) | 1283 | unsigned int importance) |
1398 | { | 1284 | { |
1399 | struct port *p_ptr; | 1285 | struct port *p_ptr; |
1400 | struct tipc_msg *msg; | 1286 | struct tipc_msg *msg; |
@@ -1457,89 +1343,15 @@ int tipc_send2name(u32 ref, | |||
1457 | } | 1343 | } |
1458 | 1344 | ||
1459 | /** | 1345 | /** |
1460 | * tipc_forward_buf2name - forward message buffer to port name | ||
1461 | */ | ||
1462 | |||
1463 | int tipc_forward_buf2name(u32 ref, | ||
1464 | struct tipc_name const *name, | ||
1465 | u32 domain, | ||
1466 | struct sk_buff *buf, | ||
1467 | unsigned int dsz, | ||
1468 | struct tipc_portid const *orig, | ||
1469 | unsigned int importance) | ||
1470 | { | ||
1471 | struct port *p_ptr; | ||
1472 | struct tipc_msg *msg; | ||
1473 | u32 destnode = domain; | ||
1474 | u32 destport; | ||
1475 | int res; | ||
1476 | |||
1477 | p_ptr = (struct port *)tipc_ref_deref(ref); | ||
1478 | if (!p_ptr || p_ptr->publ.connected) | ||
1479 | return -EINVAL; | ||
1480 | |||
1481 | msg = &p_ptr->publ.phdr; | ||
1482 | if (importance <= TIPC_CRITICAL_IMPORTANCE) | ||
1483 | msg_set_importance(msg, importance); | ||
1484 | msg_set_type(msg, TIPC_NAMED_MSG); | ||
1485 | msg_set_orignode(msg, orig->node); | ||
1486 | msg_set_origport(msg, orig->ref); | ||
1487 | msg_set_nametype(msg, name->type); | ||
1488 | msg_set_nameinst(msg, name->instance); | ||
1489 | msg_set_lookup_scope(msg, tipc_addr_scope(domain)); | ||
1490 | msg_set_hdr_sz(msg, LONG_H_SIZE); | ||
1491 | msg_set_size(msg, LONG_H_SIZE + dsz); | ||
1492 | destport = tipc_nametbl_translate(name->type, name->instance, &destnode); | ||
1493 | msg_set_destnode(msg, destnode); | ||
1494 | msg_set_destport(msg, destport); | ||
1495 | msg_dbg(msg, "forw2name ==> "); | ||
1496 | if (skb_cow(buf, LONG_H_SIZE)) | ||
1497 | return -ENOMEM; | ||
1498 | skb_push(buf, LONG_H_SIZE); | ||
1499 | skb_copy_to_linear_data(buf, msg, LONG_H_SIZE); | ||
1500 | msg_dbg(buf_msg(buf),"PREP:"); | ||
1501 | if (likely(destport)) { | ||
1502 | p_ptr->sent++; | ||
1503 | if (destnode == tipc_own_addr) | ||
1504 | return tipc_port_recv_msg(buf); | ||
1505 | res = tipc_send_buf_fast(buf, destnode); | ||
1506 | if (likely(res != -ELINKCONG)) | ||
1507 | return res; | ||
1508 | if (port_unreliable(p_ptr)) | ||
1509 | return dsz; | ||
1510 | return -ELINKCONG; | ||
1511 | } | ||
1512 | return tipc_reject_msg(buf, TIPC_ERR_NO_NAME); | ||
1513 | } | ||
1514 | |||
1515 | /** | ||
1516 | * tipc_send_buf2name - send message buffer to port name | ||
1517 | */ | ||
1518 | |||
1519 | int tipc_send_buf2name(u32 ref, | ||
1520 | struct tipc_name const *dest, | ||
1521 | u32 domain, | ||
1522 | struct sk_buff *buf, | ||
1523 | unsigned int dsz) | ||
1524 | { | ||
1525 | struct tipc_portid orig; | ||
1526 | |||
1527 | orig.ref = ref; | ||
1528 | orig.node = tipc_own_addr; | ||
1529 | return tipc_forward_buf2name(ref, dest, domain, buf, dsz, &orig, | ||
1530 | TIPC_PORT_IMPORTANCE); | ||
1531 | } | ||
1532 | |||
1533 | /** | ||
1534 | * tipc_forward2port - forward message sections to port identity | 1346 | * tipc_forward2port - forward message sections to port identity |
1535 | */ | 1347 | */ |
1536 | 1348 | ||
1537 | int tipc_forward2port(u32 ref, | 1349 | static int tipc_forward2port(u32 ref, |
1538 | struct tipc_portid const *dest, | 1350 | struct tipc_portid const *dest, |
1539 | unsigned int num_sect, | 1351 | unsigned int num_sect, |
1540 | struct iovec const *msg_sect, | 1352 | struct iovec const *msg_sect, |
1541 | struct tipc_portid const *orig, | 1353 | struct tipc_portid const *orig, |
1542 | unsigned int importance) | 1354 | unsigned int importance) |
1543 | { | 1355 | { |
1544 | struct port *p_ptr; | 1356 | struct port *p_ptr; |
1545 | struct tipc_msg *msg; | 1357 | struct tipc_msg *msg; |
@@ -1591,12 +1403,12 @@ int tipc_send2port(u32 ref, | |||
1591 | /** | 1403 | /** |
1592 | * tipc_forward_buf2port - forward message buffer to port identity | 1404 | * tipc_forward_buf2port - forward message buffer to port identity |
1593 | */ | 1405 | */ |
1594 | int tipc_forward_buf2port(u32 ref, | 1406 | static int tipc_forward_buf2port(u32 ref, |
1595 | struct tipc_portid const *dest, | 1407 | struct tipc_portid const *dest, |
1596 | struct sk_buff *buf, | 1408 | struct sk_buff *buf, |
1597 | unsigned int dsz, | 1409 | unsigned int dsz, |
1598 | struct tipc_portid const *orig, | 1410 | struct tipc_portid const *orig, |
1599 | unsigned int importance) | 1411 | unsigned int importance) |
1600 | { | 1412 | { |
1601 | struct port *p_ptr; | 1413 | struct port *p_ptr; |
1602 | struct tipc_msg *msg; | 1414 | struct tipc_msg *msg; |