Skip to content

Commit 42105cc

Browse files
david-marchandbluca
authored andcommitted
net/tap: fix build with LTO
[ upstream commit adb95cc ] The compiler has trouble understanding that the code is actually pointing at the data in the message past the nh struct. Update the tap_nlattr_add* helpers and the NLMSG_TAIL macro passing a pointer to msg. Bugzilla ID: 1511 Fixes: 7c25284 ("net/tap: add netlink back-end for flow API") Signed-off-by: David Marchand <[email protected]> Acked-by: Stephen Hemminger <[email protected]>
1 parent 3f5bc5a commit 42105cc

File tree

4 files changed

+68
-96
lines changed

4 files changed

+68
-96
lines changed

drivers/net/tap/tap_flow.c

Lines changed: 48 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -535,20 +535,16 @@ tap_flow_create_eth(const struct rte_flow_item *item, void *data)
535535
return 0;
536536
msg = &flow->msg;
537537
if (!rte_is_zero_ether_addr(&mask->dst)) {
538-
tap_nlattr_add(&msg->nh, TCA_FLOWER_KEY_ETH_DST,
539-
RTE_ETHER_ADDR_LEN,
540-
&spec->dst.addr_bytes);
541-
tap_nlattr_add(&msg->nh,
542-
TCA_FLOWER_KEY_ETH_DST_MASK, RTE_ETHER_ADDR_LEN,
543-
&mask->dst.addr_bytes);
538+
tap_nlattr_add(msg, TCA_FLOWER_KEY_ETH_DST, RTE_ETHER_ADDR_LEN,
539+
&spec->dst.addr_bytes);
540+
tap_nlattr_add(msg, TCA_FLOWER_KEY_ETH_DST_MASK, RTE_ETHER_ADDR_LEN,
541+
&mask->dst.addr_bytes);
544542
}
545543
if (!rte_is_zero_ether_addr(&mask->src)) {
546-
tap_nlattr_add(&msg->nh, TCA_FLOWER_KEY_ETH_SRC,
547-
RTE_ETHER_ADDR_LEN,
544+
tap_nlattr_add(msg, TCA_FLOWER_KEY_ETH_SRC, RTE_ETHER_ADDR_LEN,
548545
&spec->src.addr_bytes);
549-
tap_nlattr_add(&msg->nh,
550-
TCA_FLOWER_KEY_ETH_SRC_MASK, RTE_ETHER_ADDR_LEN,
551-
&mask->src.addr_bytes);
546+
tap_nlattr_add(msg, TCA_FLOWER_KEY_ETH_SRC_MASK, RTE_ETHER_ADDR_LEN,
547+
&mask->src.addr_bytes);
552548
}
553549
return 0;
554550
}
@@ -604,11 +600,9 @@ tap_flow_create_vlan(const struct rte_flow_item *item, void *data)
604600
uint8_t vid = VLAN_ID(tci);
605601

606602
if (prio)
607-
tap_nlattr_add8(&msg->nh,
608-
TCA_FLOWER_KEY_VLAN_PRIO, prio);
603+
tap_nlattr_add8(msg, TCA_FLOWER_KEY_VLAN_PRIO, prio);
609604
if (vid)
610-
tap_nlattr_add16(&msg->nh,
611-
TCA_FLOWER_KEY_VLAN_ID, vid);
605+
tap_nlattr_add16(msg, TCA_FLOWER_KEY_VLAN_ID, vid);
612606
}
613607
return 0;
614608
}
@@ -651,20 +645,15 @@ tap_flow_create_ipv4(const struct rte_flow_item *item, void *data)
651645
if (!spec)
652646
return 0;
653647
if (mask->hdr.dst_addr) {
654-
tap_nlattr_add32(&msg->nh, TCA_FLOWER_KEY_IPV4_DST,
655-
spec->hdr.dst_addr);
656-
tap_nlattr_add32(&msg->nh, TCA_FLOWER_KEY_IPV4_DST_MASK,
657-
mask->hdr.dst_addr);
648+
tap_nlattr_add32(msg, TCA_FLOWER_KEY_IPV4_DST, spec->hdr.dst_addr);
649+
tap_nlattr_add32(msg, TCA_FLOWER_KEY_IPV4_DST_MASK, mask->hdr.dst_addr);
658650
}
659651
if (mask->hdr.src_addr) {
660-
tap_nlattr_add32(&msg->nh, TCA_FLOWER_KEY_IPV4_SRC,
661-
spec->hdr.src_addr);
662-
tap_nlattr_add32(&msg->nh, TCA_FLOWER_KEY_IPV4_SRC_MASK,
663-
mask->hdr.src_addr);
652+
tap_nlattr_add32(msg, TCA_FLOWER_KEY_IPV4_SRC, spec->hdr.src_addr);
653+
tap_nlattr_add32(msg, TCA_FLOWER_KEY_IPV4_SRC_MASK, mask->hdr.src_addr);
664654
}
665655
if (spec->hdr.next_proto_id)
666-
tap_nlattr_add8(&msg->nh, TCA_FLOWER_KEY_IP_PROTO,
667-
spec->hdr.next_proto_id);
656+
tap_nlattr_add8(msg, TCA_FLOWER_KEY_IP_PROTO, spec->hdr.next_proto_id);
668657
return 0;
669658
}
670659

@@ -707,20 +696,19 @@ tap_flow_create_ipv6(const struct rte_flow_item *item, void *data)
707696
if (!spec)
708697
return 0;
709698
if (memcmp(mask->hdr.dst_addr, empty_addr, 16)) {
710-
tap_nlattr_add(&msg->nh, TCA_FLOWER_KEY_IPV6_DST,
711-
sizeof(spec->hdr.dst_addr), &spec->hdr.dst_addr);
712-
tap_nlattr_add(&msg->nh, TCA_FLOWER_KEY_IPV6_DST_MASK,
713-
sizeof(mask->hdr.dst_addr), &mask->hdr.dst_addr);
699+
tap_nlattr_add(msg, TCA_FLOWER_KEY_IPV6_DST, sizeof(spec->hdr.dst_addr),
700+
&spec->hdr.dst_addr);
701+
tap_nlattr_add(msg, TCA_FLOWER_KEY_IPV6_DST_MASK, sizeof(mask->hdr.dst_addr),
702+
&mask->hdr.dst_addr);
714703
}
715704
if (memcmp(mask->hdr.src_addr, empty_addr, 16)) {
716-
tap_nlattr_add(&msg->nh, TCA_FLOWER_KEY_IPV6_SRC,
717-
sizeof(spec->hdr.src_addr), &spec->hdr.src_addr);
718-
tap_nlattr_add(&msg->nh, TCA_FLOWER_KEY_IPV6_SRC_MASK,
719-
sizeof(mask->hdr.src_addr), &mask->hdr.src_addr);
705+
tap_nlattr_add(msg, TCA_FLOWER_KEY_IPV6_SRC, sizeof(spec->hdr.src_addr),
706+
&spec->hdr.src_addr);
707+
tap_nlattr_add(msg, TCA_FLOWER_KEY_IPV6_SRC_MASK, sizeof(mask->hdr.src_addr),
708+
&mask->hdr.src_addr);
720709
}
721710
if (spec->hdr.proto)
722-
tap_nlattr_add8(&msg->nh,
723-
TCA_FLOWER_KEY_IP_PROTO, spec->hdr.proto);
711+
tap_nlattr_add8(msg, TCA_FLOWER_KEY_IP_PROTO, spec->hdr.proto);
724712
return 0;
725713
}
726714

@@ -758,15 +746,13 @@ tap_flow_create_udp(const struct rte_flow_item *item, void *data)
758746
if (!flow)
759747
return 0;
760748
msg = &flow->msg;
761-
tap_nlattr_add8(&msg->nh, TCA_FLOWER_KEY_IP_PROTO, IPPROTO_UDP);
749+
tap_nlattr_add8(msg, TCA_FLOWER_KEY_IP_PROTO, IPPROTO_UDP);
762750
if (!spec)
763751
return 0;
764752
if (mask->hdr.dst_port)
765-
tap_nlattr_add16(&msg->nh, TCA_FLOWER_KEY_UDP_DST,
766-
spec->hdr.dst_port);
753+
tap_nlattr_add16(msg, TCA_FLOWER_KEY_UDP_DST, spec->hdr.dst_port);
767754
if (mask->hdr.src_port)
768-
tap_nlattr_add16(&msg->nh, TCA_FLOWER_KEY_UDP_SRC,
769-
spec->hdr.src_port);
755+
tap_nlattr_add16(msg, TCA_FLOWER_KEY_UDP_SRC, spec->hdr.src_port);
770756
return 0;
771757
}
772758

@@ -804,15 +790,13 @@ tap_flow_create_tcp(const struct rte_flow_item *item, void *data)
804790
if (!flow)
805791
return 0;
806792
msg = &flow->msg;
807-
tap_nlattr_add8(&msg->nh, TCA_FLOWER_KEY_IP_PROTO, IPPROTO_TCP);
793+
tap_nlattr_add8(msg, TCA_FLOWER_KEY_IP_PROTO, IPPROTO_TCP);
808794
if (!spec)
809795
return 0;
810796
if (mask->hdr.dst_port)
811-
tap_nlattr_add16(&msg->nh, TCA_FLOWER_KEY_TCP_DST,
812-
spec->hdr.dst_port);
797+
tap_nlattr_add16(msg, TCA_FLOWER_KEY_TCP_DST, spec->hdr.dst_port);
813798
if (mask->hdr.src_port)
814-
tap_nlattr_add16(&msg->nh, TCA_FLOWER_KEY_TCP_SRC,
815-
spec->hdr.src_port);
799+
tap_nlattr_add16(msg, TCA_FLOWER_KEY_TCP_SRC, spec->hdr.src_port);
816800
return 0;
817801
}
818802

@@ -920,35 +904,27 @@ add_action(struct rte_flow *flow, size_t *act_index, struct action_data *adata)
920904
if (tap_nlattr_nested_start(msg, (*act_index)++) < 0)
921905
return -1;
922906

923-
tap_nlattr_add(&msg->nh, TCA_ACT_KIND,
924-
strlen(adata->id) + 1, adata->id);
907+
tap_nlattr_add(msg, TCA_ACT_KIND, strlen(adata->id) + 1, adata->id);
925908
if (tap_nlattr_nested_start(msg, TCA_ACT_OPTIONS) < 0)
926909
return -1;
927910
if (strcmp("gact", adata->id) == 0) {
928-
tap_nlattr_add(&msg->nh, TCA_GACT_PARMS, sizeof(adata->gact),
929-
&adata->gact);
911+
tap_nlattr_add(msg, TCA_GACT_PARMS, sizeof(adata->gact), &adata->gact);
930912
} else if (strcmp("mirred", adata->id) == 0) {
931913
if (adata->mirred.eaction == TCA_EGRESS_MIRROR)
932914
adata->mirred.action = TC_ACT_PIPE;
933915
else /* REDIRECT */
934916
adata->mirred.action = TC_ACT_STOLEN;
935-
tap_nlattr_add(&msg->nh, TCA_MIRRED_PARMS,
936-
sizeof(adata->mirred),
937-
&adata->mirred);
917+
tap_nlattr_add(msg, TCA_MIRRED_PARMS, sizeof(adata->mirred), &adata->mirred);
938918
} else if (strcmp("skbedit", adata->id) == 0) {
939-
tap_nlattr_add(&msg->nh, TCA_SKBEDIT_PARMS,
940-
sizeof(adata->skbedit.skbedit),
941-
&adata->skbedit.skbedit);
942-
tap_nlattr_add16(&msg->nh, TCA_SKBEDIT_QUEUE_MAPPING,
943-
adata->skbedit.queue);
919+
tap_nlattr_add(msg, TCA_SKBEDIT_PARMS, sizeof(adata->skbedit.skbedit),
920+
&adata->skbedit.skbedit);
921+
tap_nlattr_add16(msg, TCA_SKBEDIT_QUEUE_MAPPING, adata->skbedit.queue);
944922
} else if (strcmp("bpf", adata->id) == 0) {
945-
tap_nlattr_add32(&msg->nh, TCA_ACT_BPF_FD, adata->bpf.bpf_fd);
946-
tap_nlattr_add(&msg->nh, TCA_ACT_BPF_NAME,
947-
strlen(adata->bpf.annotation) + 1,
948-
adata->bpf.annotation);
949-
tap_nlattr_add(&msg->nh, TCA_ACT_BPF_PARMS,
950-
sizeof(adata->bpf.bpf),
951-
&adata->bpf.bpf);
923+
tap_nlattr_add32(msg, TCA_ACT_BPF_FD, adata->bpf.bpf_fd);
924+
tap_nlattr_add(msg, TCA_ACT_BPF_NAME, strlen(adata->bpf.annotation) + 1,
925+
adata->bpf.annotation);
926+
tap_nlattr_add(msg, TCA_ACT_BPF_PARMS, sizeof(adata->bpf.bpf),
927+
&adata->bpf.bpf);
952928
} else {
953929
return -1;
954930
}
@@ -1078,7 +1054,7 @@ priv_flow_process(struct pmd_internals *pmd,
10781054
TC_H_MAKE(MULTIQ_MAJOR_HANDLE, 0);
10791055
}
10801056
/* use flower filter type */
1081-
tap_nlattr_add(&flow->msg.nh, TCA_KIND, sizeof("flower"), "flower");
1057+
tap_nlattr_add(&flow->msg, TCA_KIND, sizeof("flower"), "flower");
10821058
if (tap_nlattr_nested_start(&flow->msg, TCA_OPTIONS) < 0) {
10831059
rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_ACTION,
10841060
actions, "could not allocated netlink msg");
@@ -1118,15 +1094,11 @@ priv_flow_process(struct pmd_internals *pmd,
11181094
}
11191095
if (flow) {
11201096
if (data.vlan) {
1121-
tap_nlattr_add16(&flow->msg.nh, TCA_FLOWER_KEY_ETH_TYPE,
1122-
htons(ETH_P_8021Q));
1123-
tap_nlattr_add16(&flow->msg.nh,
1124-
TCA_FLOWER_KEY_VLAN_ETH_TYPE,
1125-
data.eth_type ?
1126-
data.eth_type : htons(ETH_P_ALL));
1097+
tap_nlattr_add16(&flow->msg, TCA_FLOWER_KEY_ETH_TYPE, htons(ETH_P_8021Q));
1098+
tap_nlattr_add16(&flow->msg, TCA_FLOWER_KEY_VLAN_ETH_TYPE,
1099+
data.eth_type ? data.eth_type : htons(ETH_P_ALL));
11271100
} else if (data.eth_type) {
1128-
tap_nlattr_add16(&flow->msg.nh, TCA_FLOWER_KEY_ETH_TYPE,
1129-
data.eth_type);
1101+
tap_nlattr_add16(&flow->msg, TCA_FLOWER_KEY_ETH_TYPE, data.eth_type);
11301102
}
11311103
}
11321104
if (mirred && flow) {
@@ -1919,13 +1891,13 @@ static int rss_enable(struct pmd_internals *pmd,
19191891
msg->t.tcm_info = TC_H_MAKE(prio << 16, msg->t.tcm_info);
19201892
msg->t.tcm_parent = TC_H_MAKE(MULTIQ_MAJOR_HANDLE, 0);
19211893

1922-
tap_nlattr_add(&msg->nh, TCA_KIND, sizeof("bpf"), "bpf");
1894+
tap_nlattr_add(msg, TCA_KIND, sizeof("bpf"), "bpf");
19231895
if (tap_nlattr_nested_start(msg, TCA_OPTIONS) < 0)
19241896
return -1;
1925-
tap_nlattr_add32(&msg->nh, TCA_BPF_FD, pmd->bpf_fd[i]);
1897+
tap_nlattr_add32(msg, TCA_BPF_FD, pmd->bpf_fd[i]);
19261898
snprintf(annotation, sizeof(annotation), "[%s%d]",
19271899
SEC_NAME_CLS_Q, i);
1928-
tap_nlattr_add(&msg->nh, TCA_BPF_NAME, strlen(annotation) + 1,
1900+
tap_nlattr_add(msg, TCA_BPF_NAME, strlen(annotation) + 1,
19291901
annotation);
19301902
/* Actions */
19311903
{

drivers/net/tap/tap_netlink.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -293,18 +293,18 @@ tap_nl_recv(int nlsk_fd, int (*cb)(struct nlmsghdr *, void *arg), void *arg)
293293
* The data to append.
294294
*/
295295
void
296-
tap_nlattr_add(struct nlmsghdr *nh, unsigned short type,
296+
tap_nlattr_add(struct nlmsg *msg, unsigned short type,
297297
unsigned int data_len, const void *data)
298298
{
299299
/* see man 3 rtnetlink */
300300
struct rtattr *rta;
301301

302-
rta = (struct rtattr *)NLMSG_TAIL(nh);
302+
rta = (struct rtattr *)NLMSG_TAIL(msg);
303303
rta->rta_len = RTA_LENGTH(data_len);
304304
rta->rta_type = type;
305305
if (data_len > 0)
306306
memcpy(RTA_DATA(rta), data, data_len);
307-
nh->nlmsg_len = NLMSG_ALIGN(nh->nlmsg_len) + RTA_ALIGN(rta->rta_len);
307+
msg->nh.nlmsg_len = NLMSG_ALIGN(msg->nh.nlmsg_len) + RTA_ALIGN(rta->rta_len);
308308
}
309309

310310
/**
@@ -318,9 +318,9 @@ tap_nlattr_add(struct nlmsghdr *nh, unsigned short type,
318318
* The data to append.
319319
*/
320320
void
321-
tap_nlattr_add8(struct nlmsghdr *nh, unsigned short type, uint8_t data)
321+
tap_nlattr_add8(struct nlmsg *msg, unsigned short type, uint8_t data)
322322
{
323-
tap_nlattr_add(nh, type, sizeof(uint8_t), &data);
323+
tap_nlattr_add(msg, type, sizeof(uint8_t), &data);
324324
}
325325

326326
/**
@@ -334,9 +334,9 @@ tap_nlattr_add8(struct nlmsghdr *nh, unsigned short type, uint8_t data)
334334
* The data to append.
335335
*/
336336
void
337-
tap_nlattr_add16(struct nlmsghdr *nh, unsigned short type, uint16_t data)
337+
tap_nlattr_add16(struct nlmsg *msg, unsigned short type, uint16_t data)
338338
{
339-
tap_nlattr_add(nh, type, sizeof(uint16_t), &data);
339+
tap_nlattr_add(msg, type, sizeof(uint16_t), &data);
340340
}
341341

342342
/**
@@ -350,9 +350,9 @@ tap_nlattr_add16(struct nlmsghdr *nh, unsigned short type, uint16_t data)
350350
* The data to append.
351351
*/
352352
void
353-
tap_nlattr_add32(struct nlmsghdr *nh, unsigned short type, uint32_t data)
353+
tap_nlattr_add32(struct nlmsg *msg, unsigned short type, uint32_t data)
354354
{
355-
tap_nlattr_add(nh, type, sizeof(uint32_t), &data);
355+
tap_nlattr_add(msg, type, sizeof(uint32_t), &data);
356356
}
357357

358358
/**
@@ -379,9 +379,9 @@ tap_nlattr_nested_start(struct nlmsg *msg, uint16_t type)
379379
return -1;
380380
}
381381

382-
tail->tail = (struct rtattr *)NLMSG_TAIL(&msg->nh);
382+
tail->tail = (struct rtattr *)NLMSG_TAIL(msg);
383383

384-
tap_nlattr_add(&msg->nh, type, 0, NULL);
384+
tap_nlattr_add(msg, type, 0, NULL);
385385

386386
tail->prev = msg->nested_tails;
387387

@@ -404,7 +404,7 @@ tap_nlattr_nested_finish(struct nlmsg *msg)
404404
{
405405
struct nested_tail *tail = msg->nested_tails;
406406

407-
tail->tail->rta_len = (char *)NLMSG_TAIL(&msg->nh) - (char *)tail->tail;
407+
tail->tail->rta_len = (char *)NLMSG_TAIL(msg) - (char *)tail->tail;
408408

409409
if (tail->prev)
410410
msg->nested_tails = tail->prev;

drivers/net/tap/tap_netlink.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,19 @@ struct nlmsg {
2323
struct nested_tail *nested_tails;
2424
};
2525

26-
#define NLMSG_TAIL(nlh) (void *)((char *)(nlh) + NLMSG_ALIGN((nlh)->nlmsg_len))
26+
#define NLMSG_TAIL(msg) (void *)((char *)(msg) + NLMSG_ALIGN((msg)->nh.nlmsg_len))
2727

2828
int tap_nl_init(uint32_t nl_groups);
2929
int tap_nl_final(int nlsk_fd);
3030
int tap_nl_send(int nlsk_fd, struct nlmsghdr *nh);
3131
int tap_nl_recv(int nlsk_fd, int (*callback)(struct nlmsghdr *, void *),
3232
void *arg);
3333
int tap_nl_recv_ack(int nlsk_fd);
34-
void tap_nlattr_add(struct nlmsghdr *nh, unsigned short type,
34+
void tap_nlattr_add(struct nlmsg *msg, unsigned short type,
3535
unsigned int data_len, const void *data);
36-
void tap_nlattr_add8(struct nlmsghdr *nh, unsigned short type, uint8_t data);
37-
void tap_nlattr_add16(struct nlmsghdr *nh, unsigned short type, uint16_t data);
38-
void tap_nlattr_add32(struct nlmsghdr *nh, unsigned short type, uint32_t data);
36+
void tap_nlattr_add8(struct nlmsg *msg, unsigned short type, uint8_t data);
37+
void tap_nlattr_add16(struct nlmsg *msg, unsigned short type, uint16_t data);
38+
void tap_nlattr_add32(struct nlmsg *msg, unsigned short type, uint32_t data);
3939
int tap_nlattr_nested_start(struct nlmsg *msg, uint16_t type);
4040
void tap_nlattr_nested_finish(struct nlmsg *msg);
4141

drivers/net/tap/tap_tcmsgs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ qdisc_add_multiq(int nlsk_fd, unsigned int ifindex)
123123
NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE);
124124
msg.t.tcm_handle = TC_H_MAKE(MULTIQ_MAJOR_HANDLE, 0);
125125
msg.t.tcm_parent = TC_H_ROOT;
126-
tap_nlattr_add(&msg.nh, TCA_KIND, sizeof("multiq"), "multiq");
127-
tap_nlattr_add(&msg.nh, TCA_OPTIONS, sizeof(opt), &opt);
126+
tap_nlattr_add(&msg, TCA_KIND, sizeof("multiq"), "multiq");
127+
tap_nlattr_add(&msg, TCA_OPTIONS, sizeof(opt), &opt);
128128
if (tap_nl_send(nlsk_fd, &msg.nh) < 0)
129129
return -1;
130130
if (tap_nl_recv_ack(nlsk_fd) < 0)
@@ -152,7 +152,7 @@ qdisc_add_ingress(int nlsk_fd, unsigned int ifindex)
152152
NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE);
153153
msg.t.tcm_handle = TC_H_MAKE(TC_H_INGRESS, 0);
154154
msg.t.tcm_parent = TC_H_INGRESS;
155-
tap_nlattr_add(&msg.nh, TCA_KIND, sizeof("ingress"), "ingress");
155+
tap_nlattr_add(&msg, TCA_KIND, sizeof("ingress"), "ingress");
156156
if (tap_nl_send(nlsk_fd, &msg.nh) < 0)
157157
return -1;
158158
if (tap_nl_recv_ack(nlsk_fd) < 0)

0 commit comments

Comments
 (0)