-+ if (ct->xid[0] > 0) {
-+ mark = ct->xid[0];
-+ }
-+
-+ }
-+ else if (proto == 6) {
-+ if ((*pskb)->sk) {
-+ connection_sk = (*pskb)->sk;
-+ sock_hold(connection_sk);
-+ }
-+ else
-+ connection_sk = inet_lookup_established(&tcp_hashinfo, src_ip, src_port, ip, port, dif);
-+
-+
-+ if (connection_sk) {
-+ connection_sk->sk_peercred.gid = connection_sk->sk_peercred.uid = ct->xid[dir];
-+ ct->xid[!dir]=connection_sk->sk_nid;
-+ if (connection_sk->sk_nid != 0)
-+ mark = connection_sk->sk_nid;
-+ if (connection_sk->sk_state == TCP_TIME_WAIT) {
-+ inet_twsk_put(inet_twsk(connection_sk));
-+ break;
-+ }
-+ else
-+ sock_put(connection_sk);
-+ }
-+ else
-+ mark = -1 ;
-+ }
-+ break;
++
++ dir = CTINFO2DIR(ctinfo);
++ src_ip = ct->tuplehash[dir].tuple.src.u3.ip;
++ dst_ip = ct->tuplehash[dir].tuple.dst.u3.ip;
++ src_port = get_src_port(&ct->tuplehash[dir].tuple);
++ proto = ct->tuplehash[dir].tuple.dst.protonum;
++
++ ip = ct->tuplehash[dir].tuple.dst.u3.ip;
++ port = get_dst_port(&ct->tuplehash[dir].tuple);
++
++ if (proto == 1 || proto == 17) {
++ if ((*pskb)->mark>0) /* The packet is marked, it's going out */
++ {
++ ct->xid[0]=(*pskb)->mark;
++ }
++
++ if (ct->xid[0] > 0) {
++ mark = ct->xid[0];
++ }
++
++ }
++ else if (proto == 6) {
++ if ((*pskb)->sk) {
++ connection_sk = (*pskb)->sk;
++ sock_hold(connection_sk);
++ }
++ else
++ connection_sk = inet_lookup_established(&tcp_hashinfo, src_ip, src_port, ip, port, dif);
++
++
++ if (connection_sk) {
++ connection_sk->sk_peercred.gid = connection_sk->sk_peercred.uid = ct->xid[dir];
++ ct->xid[!dir]=connection_sk->sk_nid;
++ if (connection_sk->sk_nid != 0)
++ mark = connection_sk->sk_nid;
++ if (connection_sk->sk_state == TCP_TIME_WAIT) {
++ inet_twsk_put(inet_twsk(connection_sk));
++ break;
++ }
++ else
++ sock_put(connection_sk);
++ }
++ else
++ mark = -1 ;
++ }
++ break;