--- zzzz-none-000/linux-2.6.28.10/net/ipv4/ip_sockglue.c 2009-05-02 18:54:43.000000000 +0000 +++ puma5-6360-529/linux-2.6.28.10/net/ipv4/ip_sockglue.c 2011-04-05 15:54:27.000000000 +0000 @@ -48,11 +48,44 @@ #define IP_CMSG_RECVOPTS 8 #define IP_CMSG_RETOPTS 16 #define IP_CMSG_PASSSEC 32 +/* +* TI Extension: +* The shift into the bit mask +*/ +#ifdef CONFIG_TI_IP_PKTINFO_SOCKOPT +#define TI_IP_CMSG_PKTINFO 64 +#endif /* * SOL_IP control messages. */ +/* + * TI Extension: + * + * Function: + * ip_cmsg_recv_ti_pktinfo(struct msghdr *msg, struct sk_buff *skb) + * + * Decsription: + * The function fills the ti_pktinfo structure for the + * sending relevant information to the user + */ + +#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; + + info.ifcpe_side = skb->ti_meta_info; + ehdr = eth_hdr(skb); + memcpy( info.mac_addr, ehdr->h_source, sizeof(info.mac_addr)); + + skb->ti_meta_info=0; + 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; @@ -160,6 +193,13 @@ if (flags & 1) ip_cmsg_recv_security(msg, skb); + +#ifdef CONFIG_TI_IP_PKTINFO_SOCKOPT + if ((flags>>=1) == 0) + return; + if (flags & 1) + ip_cmsg_recv_ti_pktinfo(msg, skb); +#endif } int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) @@ -189,6 +229,28 @@ ipc->addr = info->ipi_spec_dst.s_addr; break; } +#ifdef CONFIG_TI_META_DATA + case TI_IP_META_DATA: + { + unsigned int* ptr_meta_info; + + /* Validate the length. */ + if (cmsg->cmsg_len != CMSG_LEN(sizeof(unsigned int))) + return -EINVAL; + + /* Store the meta data into the cookie. */ + ptr_meta_info = (unsigned int *)CMSG_DATA(cmsg); + ipc->ti_meta_info = *ptr_meta_info; + + /* Print the Message on the console indicating that the kernel + * succesfully received the meta-data information from user-space. + */ +#ifdef CONFIG_TI_META_DATA_CONSOLE_DUMP + printk (KERN_DEBUG "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; } @@ -419,7 +481,11 @@ (1<= sizeof(int)) { @@ -479,6 +545,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; @@ -703,7 +777,7 @@ mreq.imr_multiaddr.s_addr = mreqs.imr_multiaddr; mreq.imr_address.s_addr = mreqs.imr_interface; mreq.imr_ifindex = 0; - err = ip_mc_join_group(sk, &mreq); + err = ip_mc_join_group_for_mode(sk, &mreq, MCAST_INCLUDE); if (err && err != -EADDRINUSE) break; omode = MCAST_INCLUDE; @@ -780,7 +854,7 @@ mreq.imr_multiaddr = psin->sin_addr; mreq.imr_address.s_addr = 0; mreq.imr_ifindex = greqs.gsr_interface; - err = ip_mc_join_group(sk, &mreq); + err = ip_mc_join_group_for_mode(sk, &mreq, MCAST_INCLUDE); if (err && err != -EADDRINUSE) break; greqs.gsr_interface = mreq.imr_ifindex; @@ -1007,6 +1081,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; @@ -1130,6 +1209,10 @@ 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) + 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);