Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'tipc-some-minor-improvements'

Jon Maloy says:

====================
tipc: some minor improvements

We add some improvements that will be useful in future commits.
====================

Link: https://lore.kernel.org/r/20201125182915.711370-1-jmaloy@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+87 -76
+3 -4
net/tipc/addr.c
··· 55 55 void tipc_set_node_id(struct net *net, u8 *id) 56 56 { 57 57 struct tipc_net *tn = tipc_net(net); 58 - u32 *tmp = (u32 *)id; 59 58 60 59 memcpy(tn->node_id, id, NODE_ID_LEN); 61 60 tipc_nodeid2string(tn->node_id_string, id); 62 - tn->trial_addr = tmp[0] ^ tmp[1] ^ tmp[2] ^ tmp[3]; 63 - pr_info("Own node identity %s, cluster identity %u\n", 61 + tn->trial_addr = hash128to32(id); 62 + pr_info("Node identity %s, cluster identity %u\n", 64 63 tipc_own_id_string(net), tn->net_id); 65 64 } 66 65 ··· 75 76 } 76 77 tn->trial_addr = addr; 77 78 tn->addr_trial_end = jiffies; 78 - pr_info("32-bit node address hash set to %x\n", addr); 79 + pr_info("Node number set to %u\n", addr); 79 80 } 80 81 81 82 char *tipc_nodeid2string(char *str, u8 *id)
+1
net/tipc/addr.h
··· 3 3 * 4 4 * Copyright (c) 2000-2006, 2018, Ericsson AB 5 5 * Copyright (c) 2004-2005, Wind River Systems 6 + * Copyright (c) 2020, Red Hat Inc 6 7 * All rights reserved. 7 8 * 8 9 * Redistribution and use in source and binary forms, with or without
+12
net/tipc/core.h
··· 3 3 * 4 4 * Copyright (c) 2005-2006, 2013-2018 Ericsson AB 5 5 * Copyright (c) 2005-2007, 2010-2013, Wind River Systems 6 + * Copyright (c) 2020, Red Hat Inc 6 7 * All rights reserved. 7 8 * 8 9 * Redistribution and use in source and binary forms, with or without ··· 209 208 static inline u32 tipc_net_hash_mixes(struct net *net, int tn_rand) 210 209 { 211 210 return net_hash_mix(&init_net) ^ net_hash_mix(net) ^ tn_rand; 211 + } 212 + 213 + static inline u32 hash128to32(char *bytes) 214 + { 215 + __be32 *tmp = (__be32 *)bytes; 216 + u32 res; 217 + 218 + res = ntohl(tmp[0] ^ tmp[1] ^ tmp[2] ^ tmp[3]); 219 + if (likely(res)) 220 + return res; 221 + return ntohl(tmp[0] | tmp[1] | tmp[2] | tmp[3]); 212 222 } 213 223 214 224 #ifdef CONFIG_SYSCTL
+2 -1
net/tipc/group.c
··· 2 2 * net/tipc/group.c: TIPC group messaging code 3 3 * 4 4 * Copyright (c) 2017, Ericsson AB 5 + * Copyright (c) 2020, Red Hat Inc 5 6 * All rights reserved. 6 7 * 7 8 * Redistribution and use in source and binary forms, with or without ··· 360 359 return &grp->dests; 361 360 } 362 361 363 - void tipc_group_self(struct tipc_group *grp, struct tipc_name_seq *seq, 362 + void tipc_group_self(struct tipc_group *grp, struct tipc_service_range *seq, 364 363 int *scope) 365 364 { 366 365 seq->type = grp->type;
+2 -1
net/tipc/group.h
··· 2 2 * net/tipc/group.h: Include file for TIPC group unicast/multicast functions 3 3 * 4 4 * Copyright (c) 2017, Ericsson AB 5 + * Copyright (c) 2020, Red Hat Inc 5 6 * All rights reserved. 6 7 * 7 8 * Redistribution and use in source and binary forms, with or without ··· 51 50 void tipc_group_add_member(struct tipc_group *grp, u32 node, 52 51 u32 port, u32 instance); 53 52 struct tipc_nlist *tipc_group_dests(struct tipc_group *grp); 54 - void tipc_group_self(struct tipc_group *grp, struct tipc_name_seq *seq, 53 + void tipc_group_self(struct tipc_group *grp, struct tipc_service_range *seq, 55 54 int *scope); 56 55 u32 tipc_group_exclude(struct tipc_group *grp); 57 56 void tipc_group_filter_msg(struct tipc_group *grp,
+6 -5
net/tipc/name_table.c
··· 3 3 * 4 4 * Copyright (c) 2000-2006, 2014-2018, Ericsson AB 5 5 * Copyright (c) 2004-2008, 2010-2014, Wind River Systems 6 + * Copyright (c) 2020, Red Hat Inc 6 7 * All rights reserved. 7 8 * 8 9 * Redistribution and use in source and binary forms, with or without ··· 404 403 struct publication *p, *first, *tmp; 405 404 struct list_head publ_list; 406 405 struct service_range *sr; 407 - struct tipc_name_seq ns; 406 + struct tipc_service_range r; 408 407 u32 filter; 409 408 410 - ns.type = tipc_sub_read(sb, seq.type); 411 - ns.lower = tipc_sub_read(sb, seq.lower); 412 - ns.upper = tipc_sub_read(sb, seq.upper); 409 + r.type = tipc_sub_read(sb, seq.type); 410 + r.lower = tipc_sub_read(sb, seq.lower); 411 + r.upper = tipc_sub_read(sb, seq.upper); 413 412 filter = tipc_sub_read(sb, filter); 414 413 415 414 tipc_sub_get(sub); ··· 419 418 return; 420 419 421 420 INIT_LIST_HEAD(&publ_list); 422 - service_range_foreach_match(sr, service, ns.lower, ns.upper) { 421 + service_range_foreach_match(sr, service, r.lower, r.upper) { 423 422 first = NULL; 424 423 list_for_each_entry(p, &sr->all_publ, all_publ) { 425 424 if (filter & TIPC_SUB_PORTS)
+1 -1
net/tipc/net.c
··· 132 132 tipc_named_reinit(net); 133 133 tipc_sk_reinit(net); 134 134 tipc_mon_reinit_self(net); 135 - tipc_nametbl_publish(net, TIPC_CFG_SRV, addr, addr, 135 + tipc_nametbl_publish(net, TIPC_NODE_STATE, addr, addr, 136 136 TIPC_CLUSTER_SCOPE, 0, addr); 137 137 } 138 138
+52 -58
net/tipc/socket.c
··· 1 1 /* 2 2 * net/tipc/socket.c: TIPC socket API 3 3 * 4 - * Copyright (c) 2001-2007, 2012-2017, Ericsson AB 4 + * Copyright (c) 2001-2007, 2012-2019, Ericsson AB 5 5 * Copyright (c) 2004-2008, 2010-2013, Wind River Systems 6 + * Copyright (c) 2020, Red Hat Inc 6 7 * All rights reserved. 7 8 * 8 9 * Redistribution and use in source and binary forms, with or without ··· 139 138 bool kern); 140 139 static void tipc_sk_timeout(struct timer_list *t); 141 140 static int tipc_sk_publish(struct tipc_sock *tsk, uint scope, 142 - struct tipc_name_seq const *seq); 141 + struct tipc_service_range const *seq); 143 142 static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope, 144 - struct tipc_name_seq const *seq); 143 + struct tipc_service_range const *seq); 145 144 static int tipc_sk_leave(struct tipc_sock *tsk); 146 145 static struct tipc_sock *tipc_sk_lookup(struct net *net, u32 portid); 147 146 static int tipc_sk_insert(struct tipc_sock *tsk); ··· 645 644 } 646 645 647 646 /** 648 - * tipc_bind - associate or disassocate TIPC name(s) with a socket 647 + * __tipc_bind - associate or disassocate TIPC name(s) with a socket 649 648 * @sock: socket structure 650 - * @uaddr: socket address describing name(s) and desired operation 651 - * @uaddr_len: size of socket address data structure 649 + * @skaddr: socket address describing name(s) and desired operation 650 + * @alen: size of socket address data structure 652 651 * 653 652 * Name and name sequence binding is indicated using a positive scope value; 654 653 * a negative scope value unbinds the specified name. Specifying no name ··· 659 658 * NOTE: This routine doesn't need to take the socket lock since it doesn't 660 659 * access any non-constant socket information. 661 660 */ 662 - 663 - int tipc_sk_bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len) 661 + static int __tipc_bind(struct socket *sock, struct sockaddr *skaddr, int alen) 664 662 { 665 - struct sock *sk = sock->sk; 666 - struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; 667 - struct tipc_sock *tsk = tipc_sk(sk); 668 - int res = -EINVAL; 663 + struct sockaddr_tipc *addr = (struct sockaddr_tipc *)skaddr; 664 + struct tipc_sock *tsk = tipc_sk(sock->sk); 669 665 670 - lock_sock(sk); 671 - if (unlikely(!uaddr_len)) { 672 - res = tipc_sk_withdraw(tsk, 0, NULL); 673 - goto exit; 674 - } 675 - if (tsk->group) { 676 - res = -EACCES; 677 - goto exit; 678 - } 679 - if (uaddr_len < sizeof(struct sockaddr_tipc)) { 680 - res = -EINVAL; 681 - goto exit; 682 - } 683 - if (addr->family != AF_TIPC) { 684 - res = -EAFNOSUPPORT; 685 - goto exit; 686 - } 666 + if (unlikely(!alen)) 667 + return tipc_sk_withdraw(tsk, 0, NULL); 687 668 688 - if (addr->addrtype == TIPC_ADDR_NAME) 669 + if (addr->addrtype == TIPC_SERVICE_ADDR) 689 670 addr->addr.nameseq.upper = addr->addr.nameseq.lower; 690 - else if (addr->addrtype != TIPC_ADDR_NAMESEQ) { 691 - res = -EAFNOSUPPORT; 692 - goto exit; 693 - } 694 671 695 - res = (addr->scope >= 0) ? 696 - tipc_sk_publish(tsk, addr->scope, &addr->addr.nameseq) : 697 - tipc_sk_withdraw(tsk, -addr->scope, &addr->addr.nameseq); 698 - exit: 699 - release_sock(sk); 672 + if (tsk->group) 673 + return -EACCES; 674 + 675 + if (addr->scope >= 0) 676 + return tipc_sk_publish(tsk, addr->scope, &addr->addr.nameseq); 677 + else 678 + return tipc_sk_withdraw(tsk, -addr->scope, &addr->addr.nameseq); 679 + } 680 + 681 + int tipc_sk_bind(struct socket *sock, struct sockaddr *skaddr, int alen) 682 + { 683 + int res; 684 + 685 + lock_sock(sock->sk); 686 + res = __tipc_bind(sock, skaddr, alen); 687 + release_sock(sock->sk); 700 688 return res; 701 689 } 702 690 ··· 696 706 if (alen) { 697 707 if (alen < sizeof(struct sockaddr_tipc)) 698 708 return -EINVAL; 709 + if (addr->family != AF_TIPC) 710 + return -EAFNOSUPPORT; 711 + if (addr->addrtype > TIPC_SERVICE_ADDR) 712 + return -EAFNOSUPPORT; 699 713 if (addr->addr.nameseq.type < TIPC_RESERVED_TYPES) { 700 714 pr_warn_once("Can't bind to reserved service type %u\n", 701 715 addr->addr.nameseq.type); ··· 740 746 addr->addr.id.node = tipc_own_addr(sock_net(sk)); 741 747 } 742 748 743 - addr->addrtype = TIPC_ADDR_ID; 749 + addr->addrtype = TIPC_SOCKET_ADDR; 744 750 addr->family = AF_TIPC; 745 751 addr->scope = 0; 746 752 addr->addr.name.domain = 0; ··· 818 824 * Called from function tipc_sendmsg(), which has done all sanity checks 819 825 * Returns the number of bytes sent on success, or errno 820 826 */ 821 - static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq, 827 + static int tipc_sendmcast(struct socket *sock, struct tipc_service_range *seq, 822 828 struct msghdr *msg, size_t dlen, long timeout) 823 829 { 824 830 struct sock *sk = sock->sk; ··· 1403 1409 bool syn = !tipc_sk_type_connectionless(sk); 1404 1410 struct tipc_group *grp = tsk->group; 1405 1411 struct tipc_msg *hdr = &tsk->phdr; 1406 - struct tipc_name_seq *seq; 1412 + struct tipc_service_range *seq; 1407 1413 struct sk_buff_head pkts; 1408 1414 u32 dport = 0, dnode = 0; 1409 1415 u32 type = 0, inst = 0; ··· 1422 1428 if (grp) { 1423 1429 if (!dest) 1424 1430 return tipc_send_group_bcast(sock, m, dlen, timeout); 1425 - if (dest->addrtype == TIPC_ADDR_NAME) 1431 + if (dest->addrtype == TIPC_SERVICE_ADDR) 1426 1432 return tipc_send_group_anycast(sock, m, dlen, timeout); 1427 - if (dest->addrtype == TIPC_ADDR_ID) 1433 + if (dest->addrtype == TIPC_SOCKET_ADDR) 1428 1434 return tipc_send_group_unicast(sock, m, dlen, timeout); 1429 1435 if (dest->addrtype == TIPC_ADDR_MCAST) 1430 1436 return tipc_send_group_mcast(sock, m, dlen, timeout); ··· 1444 1450 return -EISCONN; 1445 1451 if (tsk->published) 1446 1452 return -EOPNOTSUPP; 1447 - if (dest->addrtype == TIPC_ADDR_NAME) { 1453 + if (dest->addrtype == TIPC_SERVICE_ADDR) { 1448 1454 tsk->conn_type = dest->addr.name.name.type; 1449 1455 tsk->conn_instance = dest->addr.name.name.instance; 1450 1456 } ··· 1455 1461 if (dest->addrtype == TIPC_ADDR_MCAST) 1456 1462 return tipc_sendmcast(sock, seq, m, dlen, timeout); 1457 1463 1458 - if (dest->addrtype == TIPC_ADDR_NAME) { 1464 + if (dest->addrtype == TIPC_SERVICE_ADDR) { 1459 1465 type = dest->addr.name.name.type; 1460 1466 inst = dest->addr.name.name.instance; 1461 1467 dnode = dest->addr.name.domain; 1462 1468 dport = tipc_nametbl_translate(net, type, inst, &dnode); 1463 1469 if (unlikely(!dport && !dnode)) 1464 1470 return -EHOSTUNREACH; 1465 - } else if (dest->addrtype == TIPC_ADDR_ID) { 1471 + } else if (dest->addrtype == TIPC_SOCKET_ADDR) { 1466 1472 dnode = dest->addr.id.node; 1467 1473 } else { 1468 1474 return -EINVAL; ··· 1474 1480 if (unlikely(rc)) 1475 1481 return rc; 1476 1482 1477 - if (dest->addrtype == TIPC_ADDR_NAME) { 1483 + if (dest->addrtype == TIPC_SERVICE_ADDR) { 1478 1484 msg_set_type(hdr, TIPC_NAMED_MSG); 1479 1485 msg_set_hdr_sz(hdr, NAMED_H_SIZE); 1480 1486 msg_set_nametype(hdr, type); ··· 1482 1488 msg_set_lookup_scope(hdr, tipc_node2scope(dnode)); 1483 1489 msg_set_destnode(hdr, dnode); 1484 1490 msg_set_destport(hdr, dport); 1485 - } else { /* TIPC_ADDR_ID */ 1491 + } else { /* TIPC_SOCKET_ADDR */ 1486 1492 msg_set_type(hdr, TIPC_DIRECT_MSG); 1487 1493 msg_set_lookup_scope(hdr, 0); 1488 1494 msg_set_destnode(hdr, dnode); ··· 1687 1693 return; 1688 1694 1689 1695 srcaddr->sock.family = AF_TIPC; 1690 - srcaddr->sock.addrtype = TIPC_ADDR_ID; 1696 + srcaddr->sock.addrtype = TIPC_SOCKET_ADDR; 1691 1697 srcaddr->sock.scope = 0; 1692 1698 srcaddr->sock.addr.id.ref = msg_origport(hdr); 1693 1699 srcaddr->sock.addr.id.node = msg_orignode(hdr); ··· 1699 1705 1700 1706 /* Group message users may also want to know sending member's id */ 1701 1707 srcaddr->member.family = AF_TIPC; 1702 - srcaddr->member.addrtype = TIPC_ADDR_NAME; 1708 + srcaddr->member.addrtype = TIPC_SERVICE_ADDR; 1703 1709 srcaddr->member.scope = 0; 1704 1710 srcaddr->member.addr.name.name.type = msg_nametype(hdr); 1705 1711 srcaddr->member.addr.name.name.instance = TIPC_SKB_CB(skb)->orig_member; ··· 2867 2873 } 2868 2874 2869 2875 static int tipc_sk_publish(struct tipc_sock *tsk, uint scope, 2870 - struct tipc_name_seq const *seq) 2876 + struct tipc_service_range const *seq) 2871 2877 { 2872 2878 struct sock *sk = &tsk->sk; 2873 2879 struct net *net = sock_net(sk); ··· 2895 2901 } 2896 2902 2897 2903 static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope, 2898 - struct tipc_name_seq const *seq) 2904 + struct tipc_service_range const *seq) 2899 2905 { 2900 2906 struct net *net = sock_net(&tsk->sk); 2901 2907 struct publication *publ; ··· 3042 3048 struct net *net = sock_net(&tsk->sk); 3043 3049 struct tipc_group *grp = tsk->group; 3044 3050 struct tipc_msg *hdr = &tsk->phdr; 3045 - struct tipc_name_seq seq; 3051 + struct tipc_service_range seq; 3046 3052 int rc; 3047 3053 3048 3054 if (mreq->type < TIPC_RESERVED_TYPES) ··· 3079 3085 { 3080 3086 struct net *net = sock_net(&tsk->sk); 3081 3087 struct tipc_group *grp = tsk->group; 3082 - struct tipc_name_seq seq; 3088 + struct tipc_service_range seq; 3083 3089 int scope; 3084 3090 3085 3091 if (!grp) ··· 3203 3209 { 3204 3210 struct sock *sk = sock->sk; 3205 3211 struct tipc_sock *tsk = tipc_sk(sk); 3206 - struct tipc_name_seq seq; 3212 + struct tipc_service_range seq; 3207 3213 int len, scope; 3208 3214 u32 value; 3209 3215 int res; ··· 3304 3310 u32 onode = tipc_own_addr(sock_net(sock1->sk)); 3305 3311 3306 3312 tsk1->peer.family = AF_TIPC; 3307 - tsk1->peer.addrtype = TIPC_ADDR_ID; 3313 + tsk1->peer.addrtype = TIPC_SOCKET_ADDR; 3308 3314 tsk1->peer.scope = TIPC_NODE_SCOPE; 3309 3315 tsk1->peer.addr.id.ref = tsk2->portid; 3310 3316 tsk1->peer.addr.id.node = onode; 3311 3317 tsk2->peer.family = AF_TIPC; 3312 - tsk2->peer.addrtype = TIPC_ADDR_ID; 3318 + tsk2->peer.addrtype = TIPC_SOCKET_ADDR; 3313 3319 tsk2->peer.scope = TIPC_NODE_SCOPE; 3314 3320 tsk2->peer.addr.id.ref = tsk1->portid; 3315 3321 tsk2->peer.addr.id.node = onode;
+3 -2
net/tipc/subscr.c
··· 3 3 * 4 4 * Copyright (c) 2000-2017, Ericsson AB 5 5 * Copyright (c) 2005-2007, 2010-2013, Wind River Systems 6 + * Copyright (c) 2020, Red Hat Inc 6 7 * All rights reserved. 7 8 * 8 9 * Redistribution and use in source and binary forms, with or without ··· 61 60 * 62 61 * Returns 1 if there is overlap, otherwise 0. 63 62 */ 64 - int tipc_sub_check_overlap(struct tipc_name_seq *seq, u32 found_lower, 63 + int tipc_sub_check_overlap(struct tipc_service_range *seq, u32 found_lower, 65 64 u32 found_upper) 66 65 { 67 66 if (found_lower < seq->lower) ··· 80 79 { 81 80 struct tipc_subscr *s = &sub->evt.s; 82 81 u32 filter = tipc_sub_read(s, filter); 83 - struct tipc_name_seq seq; 82 + struct tipc_service_range seq; 84 83 85 84 seq.type = tipc_sub_read(s, seq.type); 86 85 seq.lower = tipc_sub_read(s, seq.lower);
+3 -2
net/tipc/subscr.h
··· 3 3 * 4 4 * Copyright (c) 2003-2017, Ericsson AB 5 5 * Copyright (c) 2005-2007, 2012-2013, Wind River Systems 6 + * Copyright (c) 2020, Red Hat Inc 6 7 * All rights reserved. 7 8 * 8 9 * Redistribution and use in source and binary forms, with or without ··· 72 71 int conid); 73 72 void tipc_sub_unsubscribe(struct tipc_subscription *sub); 74 73 75 - int tipc_sub_check_overlap(struct tipc_name_seq *seq, u32 found_lower, 76 - u32 found_upper); 74 + int tipc_sub_check_overlap(struct tipc_service_range *seq, 75 + u32 found_lower, u32 found_upper); 77 76 void tipc_sub_report_overlap(struct tipc_subscription *sub, 78 77 u32 found_lower, u32 found_upper, 79 78 u32 event, u32 port, u32 node,
+2 -2
net/tipc/topsrv.c
··· 519 519 goto err; 520 520 521 521 saddr.family = AF_TIPC; 522 - saddr.addrtype = TIPC_ADDR_NAMESEQ; 523 - saddr.addr.nameseq.type = TIPC_TOP_SRV; 522 + saddr.addrtype = TIPC_SERVICE_RANGE; 523 + saddr.addr.nameseq.type = TIPC_TOP_SRV; 524 524 saddr.addr.nameseq.lower = TIPC_TOP_SRV; 525 525 saddr.addr.nameseq.upper = TIPC_TOP_SRV; 526 526 saddr.scope = TIPC_NODE_SCOPE;