--- zzzz-none-000/linux-5.15.111/net/ipv4/ip_sockglue.c 2023-05-11 14:00:40.000000000 +0000 +++ puma7-atom-6670-761/linux-5.15.111/net/ipv4/ip_sockglue.c 2024-02-07 10:23:30.000000000 +0000 @@ -53,6 +53,23 @@ * SOL_IP control messages. */ +#ifdef CONFIG_TI_IP_PKTINFO_SOCKOPT +static void ip_cmsg_recv_ti_pktinfo(struct msghdr *msg, struct sk_buff *skb) +{ + struct ti_pktinfo info; + struct ethhdr *ehdr; +# ifdef CONFIG_TI_META_DATA + info.ifcpe_side = skb->ti_meta_info; +# endif + ehdr = eth_hdr(skb); + memcpy( info.mac_addr, ehdr->h_source, sizeof(info.mac_addr)); +# ifdef CONFIG_TI_META_DATA + skb->ti_meta_info=0; +# endif + put_cmsg(msg, SOL_IP, TI_IP_PKTINFO, sizeof(info), &info); +} +#endif + static void ip_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb) { struct in_pktinfo info = *PKTINFO_SKB_CB(skb); @@ -231,11 +248,21 @@ return; } - if (flags & IP_CMSG_CHECKSUM) + if (flags & IP_CMSG_CHECKSUM) { ip_cmsg_recv_checksum(msg, skb, tlen, offset); + flags &= ~IP_CMSG_CHECKSUM; + if (!flags) + return; + } + if (flags & IP_CMSG_RECVFRAGSIZE) ip_cmsg_recv_fragsize(msg, skb); + +#ifdef CONFIG_TI_IP_PKTINFO_SOCKOPT + if (flags & TI_IP_CMSG_PKTINFO) + ip_cmsg_recv_ti_pktinfo(msg, skb); +#endif } EXPORT_SYMBOL(ip_cmsg_recv_offset); @@ -317,7 +344,27 @@ ipc->tos = val; ipc->priority = rt_tos2priority(ipc->tos); break; - +#ifdef CONFIG_TI_IP_PKTINFO_SOCKOPT + case TI_IP_PKTINFO: + { + printk("TI_IP_PKTINFO option is off\n"); + return -EINVAL; + } +#endif +#ifdef CONFIG_TI_META_DATA + case TI_IP_META_DATA: + { + unsigned int* ptr_meta_info; + if (cmsg->cmsg_len != CMSG_LEN(sizeof(unsigned int))) + return -EINVAL; + ptr_meta_info = (unsigned int *)CMSG_DATA(cmsg); + ipc->ti_meta_info = *ptr_meta_info; +#ifdef CONFIG_TI_META_DATA_CONSOLE_DUMP + printk ("Received Meta-Data:0x%x\n", ipc->ti_meta_info); +#endif /* CONFIG_TI_META_DATA_CONSOLE_DUMP */ + break; + } +#endif /* CONFIG_TI_META_DATA */ default: return -EINVAL; } @@ -920,6 +967,9 @@ case IP_CHECKSUM: case IP_RECVFRAGSIZE: case IP_RECVERR_RFC4884: +#ifdef CONFIG_TI_IP_PKTINFO_SOCKOPT + case TI_IP_PKTINFO: +#endif if (optlen >= sizeof(int)) { if (copy_from_sockptr(&val, optval, sizeof(val))) return -EFAULT; @@ -984,6 +1034,14 @@ else inet->cmsg_flags &= ~IP_CMSG_PKTINFO; break; +#ifdef CONFIG_TI_IP_PKTINFO_SOCKOPT + case TI_IP_PKTINFO: + if (val) + inet->cmsg_flags |= TI_IP_CMSG_PKTINFO; + else + inet->cmsg_flags &= ~TI_IP_CMSG_PKTINFO; + break; +#endif case IP_RECVTTL: if (val) inet->cmsg_flags |= IP_CMSG_TTL; @@ -1566,6 +1624,11 @@ case IP_PKTINFO: val = (inet->cmsg_flags & IP_CMSG_PKTINFO) != 0; break; +#ifdef CONFIG_TI_IP_PKTINFO_SOCKOPT + case TI_IP_PKTINFO: + val = (inet->cmsg_flags & TI_IP_CMSG_PKTINFO) != 0; + break; +#endif case IP_RECVTTL: val = (inet->cmsg_flags & IP_CMSG_TTL) != 0; break; @@ -1704,6 +1767,12 @@ info.ipi_ifindex = inet->mc_index; put_cmsg(&msg, SOL_IP, IP_PKTINFO, sizeof(info), &info); } +#ifdef CONFIG_TI_IP_PKTINFO_SOCKOPT + if (inet->cmsg_flags & TI_IP_CMSG_PKTINFO) { + printk("TI_IP_PKTINFO option is close in this mode\n"); + return -ENOPROTOOPT; + } +#endif if (inet->cmsg_flags & IP_CMSG_TTL) { int hlim = inet->mc_ttl; put_cmsg(&msg, SOL_IP, IP_TTL, sizeof(hlim), &hlim);