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

libnl: nla_put_be64(): align on a 64-bit area

nla_data() is now aligned on a 64-bit area.

A temporary version (nla_put_be64_32bit()) is added for nla_put_net64().
This function is removed in the next patch.

Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Nicolas Dichtel and committed by
David S. Miller
b46f6ded e7479122

+87 -38
+11 -4
include/net/netlink.h
··· 856 856 } 857 857 858 858 /** 859 - * nla_put_be64 - Add a __be64 netlink attribute to a socket buffer 859 + * nla_put_be64 - Add a __be64 netlink attribute to a socket buffer and align it 860 860 * @skb: socket buffer to add attribute to 861 861 * @attrtype: attribute type 862 862 * @value: numeric value 863 + * @padattr: attribute type for the padding 863 864 */ 864 - static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value) 865 + static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value, 866 + int padattr) 867 + { 868 + return nla_put_64bit(skb, attrtype, sizeof(__be64), &value, padattr); 869 + } 870 + 871 + static inline int nla_put_be64_32bit(struct sk_buff *skb, int attrtype, 872 + __be64 value) 865 873 { 866 874 return nla_put(skb, attrtype, sizeof(__be64), &value); 867 875 } 868 - 869 876 /** 870 877 * nla_put_net64 - Add 64-bit network byte order netlink attribute to a socket buffer 871 878 * @skb: socket buffer to add attribute to ··· 881 874 */ 882 875 static inline int nla_put_net64(struct sk_buff *skb, int attrtype, __be64 value) 883 876 { 884 - return nla_put_be64(skb, attrtype | NLA_F_NET_BYTEORDER, value); 877 + return nla_put_be64_32bit(skb, attrtype | NLA_F_NET_BYTEORDER, value); 885 878 } 886 879 887 880 /**
+1
include/uapi/linux/fib_rules.h
··· 49 49 FRA_TABLE, /* Extended table id */ 50 50 FRA_FWMASK, /* mask for netfilter mark */ 51 51 FRA_OIFNAME, 52 + FRA_PAD, 52 53 __FRA_MAX 53 54 }; 54 55
+2
include/uapi/linux/lwtunnel.h
··· 22 22 LWTUNNEL_IP_TTL, 23 23 LWTUNNEL_IP_TOS, 24 24 LWTUNNEL_IP_FLAGS, 25 + LWTUNNEL_IP_PAD, 25 26 __LWTUNNEL_IP_MAX, 26 27 }; 27 28 ··· 36 35 LWTUNNEL_IP6_HOPLIMIT, 37 36 LWTUNNEL_IP6_TC, 38 37 LWTUNNEL_IP6_FLAGS, 38 + LWTUNNEL_IP6_PAD, 39 39 __LWTUNNEL_IP6_MAX, 40 40 }; 41 41
+8
include/uapi/linux/netfilter/nf_tables.h
··· 182 182 NFTA_CHAIN_USE, 183 183 NFTA_CHAIN_TYPE, 184 184 NFTA_CHAIN_COUNTERS, 185 + NFTA_CHAIN_PAD, 185 186 __NFTA_CHAIN_MAX 186 187 }; 187 188 #define NFTA_CHAIN_MAX (__NFTA_CHAIN_MAX - 1) ··· 207 206 NFTA_RULE_COMPAT, 208 207 NFTA_RULE_POSITION, 209 208 NFTA_RULE_USERDATA, 209 + NFTA_RULE_PAD, 210 210 __NFTA_RULE_MAX 211 211 }; 212 212 #define NFTA_RULE_MAX (__NFTA_RULE_MAX - 1) ··· 310 308 NFTA_SET_TIMEOUT, 311 309 NFTA_SET_GC_INTERVAL, 312 310 NFTA_SET_USERDATA, 311 + NFTA_SET_PAD, 313 312 __NFTA_SET_MAX 314 313 }; 315 314 #define NFTA_SET_MAX (__NFTA_SET_MAX - 1) ··· 344 341 NFTA_SET_ELEM_EXPIRATION, 345 342 NFTA_SET_ELEM_USERDATA, 346 343 NFTA_SET_ELEM_EXPR, 344 + NFTA_SET_ELEM_PAD, 347 345 __NFTA_SET_ELEM_MAX 348 346 }; 349 347 #define NFTA_SET_ELEM_MAX (__NFTA_SET_ELEM_MAX - 1) ··· 588 584 NFTA_DYNSET_SREG_DATA, 589 585 NFTA_DYNSET_TIMEOUT, 590 586 NFTA_DYNSET_EXPR, 587 + NFTA_DYNSET_PAD, 591 588 __NFTA_DYNSET_MAX, 592 589 }; 593 590 #define NFTA_DYNSET_MAX (__NFTA_DYNSET_MAX - 1) ··· 811 806 NFTA_LIMIT_BURST, 812 807 NFTA_LIMIT_TYPE, 813 808 NFTA_LIMIT_FLAGS, 809 + NFTA_LIMIT_PAD, 814 810 __NFTA_LIMIT_MAX 815 811 }; 816 812 #define NFTA_LIMIT_MAX (__NFTA_LIMIT_MAX - 1) ··· 826 820 NFTA_COUNTER_UNSPEC, 827 821 NFTA_COUNTER_BYTES, 828 822 NFTA_COUNTER_PACKETS, 823 + NFTA_COUNTER_PAD, 829 824 __NFTA_COUNTER_MAX 830 825 }; 831 826 #define NFTA_COUNTER_MAX (__NFTA_COUNTER_MAX - 1) ··· 1062 1055 NFTA_TRACE_MARK, 1063 1056 NFTA_TRACE_NFPROTO, 1064 1057 NFTA_TRACE_POLICY, 1058 + NFTA_TRACE_PAD, 1065 1059 __NFTA_TRACE_MAX 1066 1060 }; 1067 1061 #define NFTA_TRACE_MAX (__NFTA_TRACE_MAX - 1)
+1
include/uapi/linux/openvswitch.h
··· 351 351 OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS, /* Nested OVS_VXLAN_EXT_* */ 352 352 OVS_TUNNEL_KEY_ATTR_IPV6_SRC, /* struct in6_addr src IPv6 address. */ 353 353 OVS_TUNNEL_KEY_ATTR_IPV6_DST, /* struct in6_addr dst IPv6 address. */ 354 + OVS_TUNNEL_KEY_ATTR_PAD, 354 355 __OVS_TUNNEL_KEY_ATTR_MAX 355 356 }; 356 357
+2 -2
net/core/fib_rules.c
··· 549 549 + nla_total_size(4) /* FRA_SUPPRESS_IFGROUP */ 550 550 + nla_total_size(4) /* FRA_FWMARK */ 551 551 + nla_total_size(4) /* FRA_FWMASK */ 552 - + nla_total_size(8); /* FRA_TUN_ID */ 552 + + nla_total_size_64bit(8); /* FRA_TUN_ID */ 553 553 554 554 if (ops->nlmsg_payload) 555 555 payload += ops->nlmsg_payload(rule); ··· 607 607 (rule->target && 608 608 nla_put_u32(skb, FRA_GOTO, rule->target)) || 609 609 (rule->tun_id && 610 - nla_put_be64(skb, FRA_TUN_ID, rule->tun_id))) 610 + nla_put_be64(skb, FRA_TUN_ID, rule->tun_id, FRA_PAD))) 611 611 goto nla_put_failure; 612 612 613 613 if (rule->suppress_ifgroup != -1) {
+6 -4
net/ipv4/ip_tunnel_core.c
··· 271 271 { 272 272 struct ip_tunnel_info *tun_info = lwt_tun_info(lwtstate); 273 273 274 - if (nla_put_be64(skb, LWTUNNEL_IP_ID, tun_info->key.tun_id) || 274 + if (nla_put_be64(skb, LWTUNNEL_IP_ID, tun_info->key.tun_id, 275 + LWTUNNEL_IP_PAD) || 275 276 nla_put_in_addr(skb, LWTUNNEL_IP_DST, tun_info->key.u.ipv4.dst) || 276 277 nla_put_in_addr(skb, LWTUNNEL_IP_SRC, tun_info->key.u.ipv4.src) || 277 278 nla_put_u8(skb, LWTUNNEL_IP_TOS, tun_info->key.tos) || ··· 285 284 286 285 static int ip_tun_encap_nlsize(struct lwtunnel_state *lwtstate) 287 286 { 288 - return nla_total_size(8) /* LWTUNNEL_IP_ID */ 287 + return nla_total_size_64bit(8) /* LWTUNNEL_IP_ID */ 289 288 + nla_total_size(4) /* LWTUNNEL_IP_DST */ 290 289 + nla_total_size(4) /* LWTUNNEL_IP_SRC */ 291 290 + nla_total_size(1) /* LWTUNNEL_IP_TOS */ ··· 367 366 { 368 367 struct ip_tunnel_info *tun_info = lwt_tun_info(lwtstate); 369 368 370 - if (nla_put_be64(skb, LWTUNNEL_IP6_ID, tun_info->key.tun_id) || 369 + if (nla_put_be64(skb, LWTUNNEL_IP6_ID, tun_info->key.tun_id, 370 + LWTUNNEL_IP6_PAD) || 371 371 nla_put_in6_addr(skb, LWTUNNEL_IP6_DST, &tun_info->key.u.ipv6.dst) || 372 372 nla_put_in6_addr(skb, LWTUNNEL_IP6_SRC, &tun_info->key.u.ipv6.src) || 373 373 nla_put_u8(skb, LWTUNNEL_IP6_TC, tun_info->key.tos) || ··· 381 379 382 380 static int ip6_tun_encap_nlsize(struct lwtunnel_state *lwtstate) 383 381 { 384 - return nla_total_size(8) /* LWTUNNEL_IP6_ID */ 382 + return nla_total_size_64bit(8) /* LWTUNNEL_IP6_ID */ 385 383 + nla_total_size(16) /* LWTUNNEL_IP6_DST */ 386 384 + nla_total_size(16) /* LWTUNNEL_IP6_SRC */ 387 385 + nla_total_size(1) /* LWTUNNEL_IP6_HOPLIMIT */
+11 -7
net/netfilter/nf_conntrack_netlink.c
··· 245 245 if (!nest_count) 246 246 goto nla_put_failure; 247 247 248 - if (nla_put_be64(skb, CTA_COUNTERS_PACKETS, cpu_to_be64(pkts)) || 249 - nla_put_be64(skb, CTA_COUNTERS_BYTES, cpu_to_be64(bytes))) 248 + if (nla_put_be64(skb, CTA_COUNTERS_PACKETS, cpu_to_be64(pkts), 249 + CTA_COUNTERS_PAD) || 250 + nla_put_be64(skb, CTA_COUNTERS_BYTES, cpu_to_be64(bytes), 251 + CTA_COUNTERS_PAD)) 250 252 goto nla_put_failure; 251 253 252 254 nla_nest_end(skb, nest_count); ··· 289 287 if (!nest_count) 290 288 goto nla_put_failure; 291 289 292 - if (nla_put_be64(skb, CTA_TIMESTAMP_START, cpu_to_be64(tstamp->start)) || 290 + if (nla_put_be64(skb, CTA_TIMESTAMP_START, cpu_to_be64(tstamp->start), 291 + CTA_TIMESTAMP_PAD) || 293 292 (tstamp->stop != 0 && nla_put_be64(skb, CTA_TIMESTAMP_STOP, 294 - cpu_to_be64(tstamp->stop)))) 293 + cpu_to_be64(tstamp->stop), 294 + CTA_TIMESTAMP_PAD))) 295 295 goto nla_put_failure; 296 296 nla_nest_end(skb, nest_count); 297 297 ··· 566 562 if (!nf_ct_ext_exist(ct, NF_CT_EXT_ACCT)) 567 563 return 0; 568 564 return 2 * nla_total_size(0) /* CTA_COUNTERS_ORIG|REPL */ 569 - + 2 * nla_total_size(sizeof(uint64_t)) /* CTA_COUNTERS_PACKETS */ 570 - + 2 * nla_total_size(sizeof(uint64_t)) /* CTA_COUNTERS_BYTES */ 565 + + 2 * nla_total_size_64bit(sizeof(uint64_t)) /* CTA_COUNTERS_PACKETS */ 566 + + 2 * nla_total_size_64bit(sizeof(uint64_t)) /* CTA_COUNTERS_BYTES */ 571 567 ; 572 568 } 573 569 ··· 594 590 #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP 595 591 if (!nf_ct_ext_exist(ct, NF_CT_EXT_TSTAMP)) 596 592 return 0; 597 - return nla_total_size(0) + 2 * nla_total_size(sizeof(uint64_t)); 593 + return nla_total_size(0) + 2 * nla_total_size_64bit(sizeof(uint64_t)); 598 594 #else 599 595 return 0; 600 596 #endif
+3 -1
net/netfilter/nf_conntrack_proto_dccp.c
··· 645 645 nla_put_u8(skb, CTA_PROTOINFO_DCCP_ROLE, 646 646 ct->proto.dccp.role[IP_CT_DIR_ORIGINAL]) || 647 647 nla_put_be64(skb, CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ, 648 - cpu_to_be64(ct->proto.dccp.handshake_seq))) 648 + cpu_to_be64(ct->proto.dccp.handshake_seq), 649 + CTA_PROTOINFO_DCCP_PAD)) 649 650 goto nla_put_failure; 650 651 nla_nest_end(skb, nest_parms); 651 652 spin_unlock_bh(&ct->lock); ··· 661 660 [CTA_PROTOINFO_DCCP_STATE] = { .type = NLA_U8 }, 662 661 [CTA_PROTOINFO_DCCP_ROLE] = { .type = NLA_U8 }, 663 662 [CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ] = { .type = NLA_U64 }, 663 + [CTA_PROTOINFO_DCCP_PAD] = { .type = NLA_UNSPEC }, 664 664 }; 665 665 666 666 static int nlattr_to_dccp(struct nlattr *cda[], struct nf_conn *ct)
+16 -8
net/netfilter/nf_tables_api.c
··· 944 944 if (nest == NULL) 945 945 goto nla_put_failure; 946 946 947 - if (nla_put_be64(skb, NFTA_COUNTER_PACKETS, cpu_to_be64(total.pkts)) || 948 - nla_put_be64(skb, NFTA_COUNTER_BYTES, cpu_to_be64(total.bytes))) 947 + if (nla_put_be64(skb, NFTA_COUNTER_PACKETS, cpu_to_be64(total.pkts), 948 + NFTA_COUNTER_PAD) || 949 + nla_put_be64(skb, NFTA_COUNTER_BYTES, cpu_to_be64(total.bytes), 950 + NFTA_COUNTER_PAD)) 949 951 goto nla_put_failure; 950 952 951 953 nla_nest_end(skb, nest); ··· 977 975 978 976 if (nla_put_string(skb, NFTA_CHAIN_TABLE, table->name)) 979 977 goto nla_put_failure; 980 - if (nla_put_be64(skb, NFTA_CHAIN_HANDLE, cpu_to_be64(chain->handle))) 978 + if (nla_put_be64(skb, NFTA_CHAIN_HANDLE, cpu_to_be64(chain->handle), 979 + NFTA_CHAIN_PAD)) 981 980 goto nla_put_failure; 982 981 if (nla_put_string(skb, NFTA_CHAIN_NAME, chain->name)) 983 982 goto nla_put_failure; ··· 1806 1803 goto nla_put_failure; 1807 1804 if (nla_put_string(skb, NFTA_RULE_CHAIN, chain->name)) 1808 1805 goto nla_put_failure; 1809 - if (nla_put_be64(skb, NFTA_RULE_HANDLE, cpu_to_be64(rule->handle))) 1806 + if (nla_put_be64(skb, NFTA_RULE_HANDLE, cpu_to_be64(rule->handle), 1807 + NFTA_RULE_PAD)) 1810 1808 goto nla_put_failure; 1811 1809 1812 1810 if ((event != NFT_MSG_DELRULE) && (rule->list.prev != &chain->rules)) { 1813 1811 prule = list_entry(rule->list.prev, struct nft_rule, list); 1814 1812 if (nla_put_be64(skb, NFTA_RULE_POSITION, 1815 - cpu_to_be64(prule->handle))) 1813 + cpu_to_be64(prule->handle), 1814 + NFTA_RULE_PAD)) 1816 1815 goto nla_put_failure; 1817 1816 } 1818 1817 ··· 2478 2473 } 2479 2474 2480 2475 if (set->timeout && 2481 - nla_put_be64(skb, NFTA_SET_TIMEOUT, cpu_to_be64(set->timeout))) 2476 + nla_put_be64(skb, NFTA_SET_TIMEOUT, cpu_to_be64(set->timeout), 2477 + NFTA_SET_PAD)) 2482 2478 goto nla_put_failure; 2483 2479 if (set->gc_int && 2484 2480 nla_put_be32(skb, NFTA_SET_GC_INTERVAL, htonl(set->gc_int))) ··· 3082 3076 3083 3077 if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT) && 3084 3078 nla_put_be64(skb, NFTA_SET_ELEM_TIMEOUT, 3085 - cpu_to_be64(*nft_set_ext_timeout(ext)))) 3079 + cpu_to_be64(*nft_set_ext_timeout(ext)), 3080 + NFTA_SET_ELEM_PAD)) 3086 3081 goto nla_put_failure; 3087 3082 3088 3083 if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION)) { ··· 3096 3089 expires = 0; 3097 3090 3098 3091 if (nla_put_be64(skb, NFTA_SET_ELEM_EXPIRATION, 3099 - cpu_to_be64(jiffies_to_msecs(expires)))) 3092 + cpu_to_be64(jiffies_to_msecs(expires)), 3093 + NFTA_SET_ELEM_PAD)) 3100 3094 goto nla_put_failure; 3101 3095 } 3102 3096
+3 -2
net/netfilter/nf_tables_trace.c
··· 156 156 return 0; 157 157 158 158 return nla_put_be64(nlskb, NFTA_TRACE_RULE_HANDLE, 159 - cpu_to_be64(info->rule->handle)); 159 + cpu_to_be64(info->rule->handle), 160 + NFTA_TRACE_PAD); 160 161 } 161 162 162 163 void nft_trace_notify(struct nft_traceinfo *info) ··· 175 174 size = nlmsg_total_size(sizeof(struct nfgenmsg)) + 176 175 nla_total_size(NFT_TABLE_MAXNAMELEN) + 177 176 nla_total_size(NFT_CHAIN_MAXNAMELEN) + 178 - nla_total_size(sizeof(__be64)) + /* rule handle */ 177 + nla_total_size_64bit(sizeof(__be64)) + /* rule handle */ 179 178 nla_total_size(sizeof(__be32)) + /* trace type */ 180 179 nla_total_size(0) + /* VERDICT, nested */ 181 180 nla_total_size(sizeof(u32)) + /* verdict code */
+4 -2
net/netfilter/nft_counter.c
··· 76 76 77 77 nft_counter_fetch(priv->counter, &total); 78 78 79 - if (nla_put_be64(skb, NFTA_COUNTER_BYTES, cpu_to_be64(total.bytes)) || 80 - nla_put_be64(skb, NFTA_COUNTER_PACKETS, cpu_to_be64(total.packets))) 79 + if (nla_put_be64(skb, NFTA_COUNTER_BYTES, cpu_to_be64(total.bytes), 80 + NFTA_COUNTER_PAD) || 81 + nla_put_be64(skb, NFTA_COUNTER_PACKETS, cpu_to_be64(total.packets), 82 + NFTA_COUNTER_PAD)) 81 83 goto nla_put_failure; 82 84 return 0; 83 85
+2 -1
net/netfilter/nft_dynset.c
··· 227 227 goto nla_put_failure; 228 228 if (nla_put_string(skb, NFTA_DYNSET_SET_NAME, priv->set->name)) 229 229 goto nla_put_failure; 230 - if (nla_put_be64(skb, NFTA_DYNSET_TIMEOUT, cpu_to_be64(priv->timeout))) 230 + if (nla_put_be64(skb, NFTA_DYNSET_TIMEOUT, cpu_to_be64(priv->timeout), 231 + NFTA_DYNSET_PAD)) 231 232 goto nla_put_failure; 232 233 if (priv->expr && nft_expr_dump(skb, NFTA_DYNSET_EXPR, priv->expr)) 233 234 goto nla_put_failure;
+4 -2
net/netfilter/nft_limit.c
··· 97 97 u64 secs = div_u64(limit->nsecs, NSEC_PER_SEC); 98 98 u64 rate = limit->rate - limit->burst; 99 99 100 - if (nla_put_be64(skb, NFTA_LIMIT_RATE, cpu_to_be64(rate)) || 101 - nla_put_be64(skb, NFTA_LIMIT_UNIT, cpu_to_be64(secs)) || 100 + if (nla_put_be64(skb, NFTA_LIMIT_RATE, cpu_to_be64(rate), 101 + NFTA_LIMIT_PAD) || 102 + nla_put_be64(skb, NFTA_LIMIT_UNIT, cpu_to_be64(secs), 103 + NFTA_LIMIT_PAD) || 102 104 nla_put_be32(skb, NFTA_LIMIT_BURST, htonl(limit->burst)) || 103 105 nla_put_be32(skb, NFTA_LIMIT_TYPE, htonl(type)) || 104 106 nla_put_be32(skb, NFTA_LIMIT_FLAGS, htonl(flags)))
+3 -2
net/openvswitch/flow_netlink.c
··· 261 261 /* Whenever adding new OVS_TUNNEL_KEY_ FIELDS, we should consider 262 262 * updating this function. 263 263 */ 264 - return nla_total_size(8) /* OVS_TUNNEL_KEY_ATTR_ID */ 264 + return nla_total_size_64bit(8) /* OVS_TUNNEL_KEY_ATTR_ID */ 265 265 + nla_total_size(16) /* OVS_TUNNEL_KEY_ATTR_IPV[46]_SRC */ 266 266 + nla_total_size(16) /* OVS_TUNNEL_KEY_ATTR_IPV[46]_DST */ 267 267 + nla_total_size(1) /* OVS_TUNNEL_KEY_ATTR_TOS */ ··· 720 720 unsigned short tun_proto) 721 721 { 722 722 if (output->tun_flags & TUNNEL_KEY && 723 - nla_put_be64(skb, OVS_TUNNEL_KEY_ATTR_ID, output->tun_id)) 723 + nla_put_be64(skb, OVS_TUNNEL_KEY_ATTR_ID, output->tun_id, 724 + OVS_TUNNEL_KEY_ATTR_PAD)) 724 725 return -EMSGSIZE; 725 726 switch (tun_proto) { 726 727 case AF_INET: