|
@@ -1225,8 +1225,14 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb)
|
|
|
* which has interface index (iif) as the first member of the
|
|
|
* underlying inet{6}_skb_parm struct. This code then overlays
|
|
|
* PKTINFO_SKB_CB and in_pktinfo also has iif as the first
|
|
|
- * element so the iif is picked up from the prior IPCB
|
|
|
+ * element so the iif is picked up from the prior IPCB. If iif
|
|
|
+ * is the loopback interface, then return the sending interface
|
|
|
+ * (e.g., process binds socket to eth0 for Tx which is
|
|
|
+ * redirected to loopback in the rtable/dst).
|
|
|
*/
|
|
|
+ if (pktinfo->ipi_ifindex == LOOPBACK_IFINDEX)
|
|
|
+ pktinfo->ipi_ifindex = inet_iif(skb);
|
|
|
+
|
|
|
pktinfo->ipi_spec_dst.s_addr = fib_compute_spec_dst(skb);
|
|
|
} else {
|
|
|
pktinfo->ipi_ifindex = 0;
|