--- zzzz-none-000/linux-2.6.28.10/net/ipv4/icmp.c 2009-05-02 18:54:43.000000000 +0000 +++ fusiv-7390-686/linux-2.6.28.10/net/ipv4/icmp.c 2010-10-07 10:59:31.000000000 +0000 @@ -374,6 +374,10 @@ inet->tos = ip_hdr(skb)->tos; daddr = ipc.addr = rt->rt_src; +#ifdef CONFIG_TI_META_DATA + /* Initialize the meta-information. */ + ipc.ti_meta_info = 0; +#endif ipc.opt = NULL; if (icmp_param->replyopts.optlen) { ipc.opt = &icmp_param->replyopts; @@ -381,14 +385,29 @@ daddr = icmp_param->replyopts.faddr; } { - struct flowi fl = { .nl_u = { .ip4_u = - { .daddr = daddr, - .saddr = rt->rt_spec_dst, - .tos = RT_TOS(ip_hdr(skb)->tos) } }, - .proto = IPPROTO_ICMP }; - security_skb_classify_flow(skb, &fl); - if (ip_route_output_key(net, &rt, &fl)) - goto out_unlock; + int oif_temp = 0; +#ifdef CONFIG_TI_DOCSIS_INPUT_DEV + if (skb->ti_docsis_input_dev) + { + oif_temp = skb->ti_docsis_input_dev->ifindex; + } + else +#endif /* CONFIG_TI_DOCSIS_INPUT_DEV */ + { + oif_temp = skb->dev->ifindex; + } + { + struct flowi fl = { .oif = oif_temp, + .nl_u = { .ip4_u = + { .daddr = daddr, + .saddr = rt->rt_spec_dst, + .tos = RT_TOS(ip_hdr(skb)->tos) } }, + .mark = skb->mark, + .proto = IPPROTO_ICMP }; + security_skb_classify_flow(skb, &fl); + if (ip_route_output_key(net, &rt, &fl)) + goto out_unlock; + } } if (icmpv4_xrlim_allow(net, rt, icmp_param->data.icmph.type, icmp_param->data.icmph.code)) @@ -532,6 +551,10 @@ inet_sk(sk)->tos = tos; ipc.addr = iph->saddr; ipc.opt = &icmp_param.replyopts; +#ifdef CONFIG_TI_META_DATA + /* Initialize the meta-information. */ + ipc.ti_meta_info = 0; +#endif { struct flowi fl = {