aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-generic
ModeNameSize
-rw-r--r--4level-fixup.h1028logstatsplainblame
-rw-r--r--Kbuild738logstatsplainblame
-rw-r--r--Kbuild.asm1074logstatsplainblame
-rw-r--r--atomic-long.h5244logstatsplainblame
-rw-r--r--atomic.h4915logstatsplainblame
-rw-r--r--atomic64.h1840logstatsplainblame
-rw-r--r--audit_change_attr.h419logstatsplainblame
-rw-r--r--audit_dir_write.h416logstatsplainblame
-rw-r--r--audit_read.h202logstatsplainblame
-rw-r--r--audit_signal.h36logstatsplainblame
-rw-r--r--audit_write.h283logstatsplainblame
-rw-r--r--auxvec.h218logstatsplainblame
-rw-r--r--bitops.h1234logstatsplainblame
d---------bitops626logstatsplain
-rw-r--r--bitsperlong.h874logstatsplainblame
-rw-r--r--bug.h5531logstatsplainblame
-rw-r--r--bugs.h228logstatsplainblame
-rw-r--r--cache.h345logstatsplainblame
-rw-r--r--cacheflush.h1301logstatsplainblame
-rw-r--r--checksum.h2272logstatsplainblame
-rw-r--r--cmpxchg-local.h1397logstatsplainblame
-rw-r--r--cmpxchg.h537logstatsplainblame
-rw-r--r--cputime.h1893logstatsplainblame
-rw-r--r--current.h217logstatsplainblame
-rw-r--r--delay.h1118logstatsplainblame
-rw-r--r--device.h245logstatsplainblame
-rw-r--r--div64.h1371logstatsplainblame
-rw-r--r--dma-coherent.h891logstatsplainblame
-rw-r--r--dma-mapping-broken.h2414logstatsplainblame
-rw-r--r--dma-mapping-common.h5365logstatsplainblame
-rw-r--r--dma.h514logstatsplainblame
-rw-r--r--emergency-restart.h209logstatsplainblame
-rw-r--r--errno-base.h1549logstatsplainblame
-rw-r--r--errno.h5250logstatsplainblame
-rw-r--r--fb.h232logstatsplainblame
-rw-r--r--fcntl.h4511logstatsplainblame
-rw-r--r--ftrace.h460logstatsplainblame
-rw-r--r--futex.h1277logstatsplainblame
-rw-r--r--getorder.h421logstatsplainblame
-rw-r--r--gpio.h8170logstatsplainblame
-rw-r--r--hardirq.h493logstatsplainblame
-rw-r--r--hw_irq.h270logstatsplainblame
-rw-r--r--ide_iops.h752logstatsplainblame
-rw-r--r--int-l64.h1315logstatsplainblame
-rw-r--r--int-ll64.h1473logstatsplainblame
-rw-r--r--io.h8521logstatsplainblame
-rw-r--r--ioctl.h3450logstatsplainblame
-rw-r--r--ioctls.h3535logstatsplainblame
-rw-r--r--iomap.h2870logstatsplainblame
-rw-r--r--ipcbuf.h936logstatsplainblame
-rw-r--r--irq.h364logstatsplainblame
-rw-r--r--irq_regs.h980logstatsplainblame
-rw-r--r--irqflags.h1504logstatsplainblame
-rw-r--r--kdebug.h143logstatsplainblame
-rw-r--r--kmap_types.h832logstatsplainblame
-rw-r--r--libata-portmap.h153logstatsplainblame
-rw-r--r--linkage.h225logstatsplainblame
-rw-r--r--local.h2243logstatsplainblame
-rw-r--r--local64.h3848logstatsplainblame
-rw-r--r--memory_model.h1991logstatsplainblame
-rw-r--r--mm_hooks.h425logstatsplainblame
-rw-r--r--mman-common.h2264logstatsplainblame
-rw-r--r--mman.h799logstatsplainblame
-rw-r--r--mmu.h329logstatsplainblame
-rw-r--r--mmu_context.h842logstatsplainblame
-rw-r--r--module.h421logstatsplainblame
-rw-r--r--msgbuf.h1497logstatsplainblame
-rw-r--r--mutex-dec.h2939logstatsplainblame
-rw-r--r--mutex-null.h666logstatsplainblame
-rw-r--r--mutex-xchg.h3752logstatsplainblame
-rw-r--r--mutex.h256logstatsplainblame
-rw-r--r--page.h2525logstatsplainblame
-rw-r--r--param.h510logstatsplainblame
-rw-r--r--parport.h585logstatsplainblame
-rw-r--r--pci-bridge.h1410logstatsplainblame
-rw-r--r--pci-dma-compat.h3527logstatsplainblame
-rw-r--r--pci.h1433logstatsplainblame
-rw-r--r--pci_iomap.h1213logstatsplainblame
-rw-r--r--percpu.h3246logstatsplainblame
-rw-r--r--pgalloc.h303logstatsplainblame
-rw-r--r--pgtable-nopmd.h1903logstatsplainblame
-rw-r--r--pgtable-nopud.h1822logstatsplainblame
-rw-r--r--pgtable.h12567logstatsplainblame
-rw-r--r--poll.h708logstatsplainblame
-rw-r--r--posix_types.h3732logstatsplainblame
-rw-r--r--ptrace.h1615logstatsplainblame
-rw-r--r--resource.h2909logstatsplainblame
-rw-r--r--rtc.h5462logstatsplainblame
-rw-r--r--rwsem.h2920logstatsplainblame
-rw-r--r--scatterlist.h845logstatsplainblame
-rw-r--r--sections.h1216logstatsplainblame
-rw-r--r--segment.h249logstatsplainblame
-rw-r--r--sembuf.h1194logstatsplainblame
-rw-r--r--serial.h306logstatsplainblame
-rw-r--r--setup.h127logstatsplainblame
-rw-r--r--shmbuf.h1702logstatsplainblame
-rw-r--r--shmparam.h168logstatsplainblame
-rw-r--r--siginfo.h8942logstatsplainblame
-rw-r--r--signal-defs.h802logstatsplainblame
-rw-r--r--signal.h2826logstatsplainblame
-rw-r--r--sizes.h1253logstatsplainblame
-rw-r--r--socket.h1540logstatsplainblame
-rw-r--r--sockios.h376logstatsplainblame
-rw-r--r--spinlock.h290logstatsplainblame
-rw-r--r--stat.h2570logstatsplainblame
-rw-r--r--statfs.h1796logstatsplainblame
-rw-r--r--string.h281logstatsplainblame
-rw-r--r--swab.h439logstatsplainblame
-rw-r--r--syscall.h5883logstatsplainblame
-rw-r--r--syscalls.h1635logstatsplainblame
-rw-r--r--system.h3348logstatsplainblame
-rw-r--r--termbits.h4653logstatsplainblame
-rw-r--r--termios-base.h2123logstatsplainblame
-rw-r--r--termios.h4055logstatsplainblame
-rw-r--r--timex.h469logstatsplainblame
-rw-r--r--tlb.h5288logstatsplainblame
-rw-r--r--tlbflush.h422logstatsplainblame
-rw-r--r--topology.h2163logstatsplainblame
-rw-r--r--types.h220logstatsplainblame
-rw-r--r--uaccess-unaligned.h733logstatsplainblame
-rw-r--r--uaccess.h7570logstatsplainblame
-rw-r--r--ucontext.h294logstatsplainblame
-rw-r--r--unaligned.h907logstatsplainblame
-rw-r--r--unistd.h29377logstatsplainblame
-rw-r--r--user.h242logstatsplainblame
-rw-r--r--vga.h548logstatsplainblame
-rw-r--r--vmlinux.lds.h24222logstatsplainblame
-rw-r--r--xor.h13931logstatsplainblame
/span>src.l3num, &ct->tuplehash[!dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3, IPPROTO_UDP, NULL, &rtp_port); /* Create expect for RTCP */ if ((rtcp_exp = nf_conntrack_expect_alloc(ct)) == NULL) { nf_conntrack_expect_put(rtp_exp); return -1; } nf_conntrack_expect_init(rtcp_exp, ct->tuplehash[!dir].tuple.src.l3num, &ct->tuplehash[!dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3, IPPROTO_UDP, NULL, &rtcp_port); if (memcmp(&ct->tuplehash[dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3, sizeof(ct->tuplehash[dir].tuple.src.u3)) && (nat_rtp_rtcp = rcu_dereference(nat_rtp_rtcp_hook)) && ct->status & IPS_NAT_MASK) { /* NAT needed */ ret = nat_rtp_rtcp(pskb, ct, ctinfo, data, dataoff, taddr, port, rtp_port, rtp_exp, rtcp_exp); } else { /* Conntrack only */ if (nf_conntrack_expect_related(rtp_exp) == 0) { if (nf_conntrack_expect_related(rtcp_exp) == 0) { DEBUGP("nf_ct_h323: expect RTP "); NF_CT_DUMP_TUPLE(&rtp_exp->tuple); DEBUGP("nf_ct_h323: expect RTCP "); NF_CT_DUMP_TUPLE(&rtcp_exp->tuple); } else { nf_conntrack_unexpect_related(rtp_exp); ret = -1; } } else ret = -1; } nf_conntrack_expect_put(rtp_exp); nf_conntrack_expect_put(rtcp_exp); return ret; } /****************************************************************************/ static int expect_t120(struct sk_buff **pskb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, unsigned char **data, int dataoff, H245_TransportAddress *taddr) { int dir = CTINFO2DIR(ctinfo); int ret = 0; __be16 port; union nf_conntrack_address addr; struct nf_conntrack_expect *exp; typeof(nat_t120_hook) nat_t120; /* Read T.120 address */ if (!get_h245_addr(ct, *data, taddr, &addr, &port) || memcmp(&addr, &ct->tuplehash[dir].tuple.src.u3, sizeof(addr)) || port == 0) return 0; /* Create expect for T.120 connections */ if ((exp = nf_conntrack_expect_alloc(ct)) == NULL) return -1; nf_conntrack_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num, &ct->tuplehash[!dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3, IPPROTO_TCP, NULL, &port); exp->flags = NF_CT_EXPECT_PERMANENT; /* Accept multiple channels */ if (memcmp(&ct->tuplehash[dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3, sizeof(ct->tuplehash[dir].tuple.src.u3)) && (nat_t120 = rcu_dereference(nat_t120_hook)) && ct->status & IPS_NAT_MASK) { /* NAT needed */ ret = nat_t120(pskb, ct, ctinfo, data, dataoff, taddr, port, exp); } else { /* Conntrack only */ if (nf_conntrack_expect_related(exp) == 0) { DEBUGP("nf_ct_h323: expect T.120 "); NF_CT_DUMP_TUPLE(&exp->tuple); } else ret = -1; } nf_conntrack_expect_put(exp); return ret; } /****************************************************************************/ static int process_h245_channel(struct sk_buff **pskb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, unsigned char **data, int dataoff, H2250LogicalChannelParameters *channel) { int ret; if (channel->options & eH2250LogicalChannelParameters_mediaChannel) { /* RTP */ ret = expect_rtp_rtcp(pskb, ct, ctinfo, data, dataoff, &channel->mediaChannel); if (ret < 0) return -1; } if (channel-> options & eH2250LogicalChannelParameters_mediaControlChannel) { /* RTCP */ ret = expect_rtp_rtcp(pskb, ct, ctinfo, data, dataoff, &channel->mediaControlChannel); if (ret < 0) return -1; } return 0; } /****************************************************************************/ static int process_olc(struct sk_buff **pskb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, unsigned char **data, int dataoff, OpenLogicalChannel *olc) { int ret; DEBUGP("nf_ct_h323: OpenLogicalChannel\n"); if (olc->forwardLogicalChannelParameters.multiplexParameters.choice == eOpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters) { ret = process_h245_channel(pskb, ct, ctinfo, data, dataoff, &olc-> forwardLogicalChannelParameters. multiplexParameters. h2250LogicalChannelParameters); if (ret < 0) return -1; } if ((olc->options & eOpenLogicalChannel_reverseLogicalChannelParameters) && (olc->reverseLogicalChannelParameters.options & eOpenLogicalChannel_reverseLogicalChannelParameters_multiplexParameters) && (olc->reverseLogicalChannelParameters.multiplexParameters. choice == eOpenLogicalChannel_reverseLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)) { ret = process_h245_channel(pskb, ct, ctinfo, data, dataoff, &olc-> reverseLogicalChannelParameters. multiplexParameters. h2250LogicalChannelParameters); if (ret < 0) return -1; } if ((olc->options & eOpenLogicalChannel_separateStack) && olc->forwardLogicalChannelParameters.dataType.choice == eDataType_data && olc->forwardLogicalChannelParameters.dataType.data.application. choice == eDataApplicationCapability_application_t120 && olc->forwardLogicalChannelParameters.dataType.data.application. t120.choice == eDataProtocolCapability_separateLANStack && olc->separateStack.networkAddress.choice == eNetworkAccessParameters_networkAddress_localAreaAddress) { ret = expect_t120(pskb, ct, ctinfo, data, dataoff, &olc->separateStack.networkAddress. localAreaAddress); if (ret < 0) return -1; } return 0; } /****************************************************************************/ static int process_olca(struct sk_buff **pskb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, unsigned char **data, int dataoff, OpenLogicalChannelAck *olca) { H2250LogicalChannelAckParameters *ack; int ret; DEBUGP("nf_ct_h323: OpenLogicalChannelAck\n"); if ((olca->options & eOpenLogicalChannelAck_reverseLogicalChannelParameters) && (olca->reverseLogicalChannelParameters.options & eOpenLogicalChannelAck_reverseLogicalChannelParameters_multiplexParameters) && (olca->reverseLogicalChannelParameters.multiplexParameters. choice == eOpenLogicalChannelAck_reverseLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)) { ret = process_h245_channel(pskb, ct, ctinfo, data, dataoff, &olca-> reverseLogicalChannelParameters. multiplexParameters. h2250LogicalChannelParameters); if (ret < 0) return -1; } if ((olca->options & eOpenLogicalChannelAck_forwardMultiplexAckParameters) && (olca->forwardMultiplexAckParameters.choice == eOpenLogicalChannelAck_forwardMultiplexAckParameters_h2250LogicalChannelAckParameters)) { ack = &olca->forwardMultiplexAckParameters. h2250LogicalChannelAckParameters; if (ack->options & eH2250LogicalChannelAckParameters_mediaChannel) { /* RTP */ ret = expect_rtp_rtcp(pskb, ct, ctinfo, data, dataoff, &ack->mediaChannel); if (ret < 0) return -1; } if (ack->options & eH2250LogicalChannelAckParameters_mediaControlChannel) { /* RTCP */ ret = expect_rtp_rtcp(pskb, ct, ctinfo, data, dataoff, &ack->mediaControlChannel); if (ret < 0) return -1; } } return 0; } /****************************************************************************/ static int process_h245(struct sk_buff **pskb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, unsigned char **data, int dataoff, MultimediaSystemControlMessage *mscm) { switch (mscm->choice) { case eMultimediaSystemControlMessage_request: if (mscm->request.choice == eRequestMessage_openLogicalChannel) { return process_olc(pskb, ct, ctinfo, data, dataoff, &mscm->request.openLogicalChannel); } DEBUGP("nf_ct_h323: H.245 Request %d\n", mscm->request.choice); break; case eMultimediaSystemControlMessage_response: if (mscm->response.choice == eResponseMessage_openLogicalChannelAck) { return process_olca(pskb, ct, ctinfo, data, dataoff, &mscm->response. openLogicalChannelAck); } DEBUGP("nf_ct_h323: H.245 Response %d\n", mscm->response.choice); break; default: DEBUGP("nf_ct_h323: H.245 signal %d\n", mscm->choice); break; } return 0; } /****************************************************************************/ static int h245_help(struct sk_buff **pskb, unsigned int protoff, struct nf_conn *ct, enum ip_conntrack_info ctinfo) { static MultimediaSystemControlMessage mscm; unsigned char *data = NULL; int datalen; int dataoff; int ret; /* Until there's been traffic both ways, don't look in packets. */ if (ctinfo != IP_CT_ESTABLISHED && ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) { return NF_ACCEPT; } DEBUGP("nf_ct_h245: skblen = %u\n", (*pskb)->len); spin_lock_bh(&nf_h323_lock); /* Process each TPKT */ while (get_tpkt_data(pskb, protoff, ct, ctinfo, &data, &datalen, &dataoff)) { DEBUGP("nf_ct_h245: TPKT len=%d ", datalen); NF_CT_DUMP_TUPLE(&ct->tuplehash[CTINFO2DIR(ctinfo)].tuple); /* Decode H.245 signal */ ret = DecodeMultimediaSystemControlMessage(data, datalen, &mscm); if (ret < 0) { if (net_ratelimit()) printk("nf_ct_h245: decoding error: %s\n", ret == H323_ERROR_BOUND ? "out of bound" : "out of range"); /* We don't drop when decoding error */ break; } /* Process H.245 signal */ if (process_h245(pskb, ct, ctinfo, &data, dataoff, &mscm) < 0) goto drop; } spin_unlock_bh(&nf_h323_lock); return NF_ACCEPT; drop: spin_unlock_bh(&nf_h323_lock); if (net_ratelimit()) printk("nf_ct_h245: packet dropped\n"); return NF_DROP; } /****************************************************************************/ static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = { .name = "H.245", .me = THIS_MODULE, .max_expected = H323_RTP_CHANNEL_MAX * 4 + 2 /* T.120 */, .timeout = 240, .tuple.dst.protonum = IPPROTO_UDP, .mask.src.u.udp.port = __constant_htons(0xFFFF), .mask.dst.protonum = 0xFF, .help = h245_help }; /****************************************************************************/ int get_h225_addr(struct nf_conn *ct, unsigned char *data, TransportAddress *taddr, union nf_conntrack_address *addr, __be16 *port) { unsigned char *p; int family = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num; int len; switch (taddr->choice) { case eTransportAddress_ipAddress: if (family != AF_INET) return 0; p = data + taddr->ipAddress.ip; len = 4; break; case eTransportAddress_ip6Address: if (family != AF_INET6) return 0; p = data + taddr->ip6Address.ip6; len = 16; break; default: return 0; } memcpy(addr, p, len); memset((void *)addr + len, 0, sizeof(*addr) - len); memcpy(port, p + len, sizeof(__be16)); return 1; } /****************************************************************************/ static int expect_h245(struct sk_buff **pskb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, unsigned char **data, int dataoff, TransportAddress *taddr) { int dir = CTINFO2DIR(ctinfo); int ret = 0; __be16 port; union nf_conntrack_address addr; struct nf_conntrack_expect *exp; typeof(nat_h245_hook) nat_h245; /* Read h245Address */ if (!get_h225_addr(ct, *data, taddr, &addr, &port) || memcmp(&addr, &ct->tuplehash[dir].tuple.src.u3, sizeof(addr)) || port == 0) return 0; /* Create expect for h245 connection */ if ((exp = nf_conntrack_expect_alloc(ct)) == NULL) return -1; nf_conntrack_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num, &ct->tuplehash[!dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3, IPPROTO_TCP, NULL, &port); exp->helper = &nf_conntrack_helper_h245; if (memcmp(&ct->tuplehash[dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3, sizeof(ct->tuplehash[dir].tuple.src.u3)) && (nat_h245 = rcu_dereference(nat_h245_hook)) && ct->status & IPS_NAT_MASK) { /* NAT needed */ ret = nat_h245(pskb, ct, ctinfo, data, dataoff, taddr, port, exp); } else { /* Conntrack only */ if (nf_conntrack_expect_related(exp) == 0) { DEBUGP("nf_ct_q931: expect H.245 "); NF_CT_DUMP_TUPLE(&exp->tuple); } else ret = -1; } nf_conntrack_expect_put(exp); return ret; } /* If the calling party is on the same side of the forward-to party, * we don't need to track the second call */ static int callforward_do_filter(union nf_conntrack_address *src, union nf_conntrack_address *dst, int family) { struct flowi fl1, fl2; int ret = 0; memset(&fl1, 0, sizeof(fl1)); memset(&fl2, 0, sizeof(fl2)); switch (family) { case AF_INET: { struct rtable *rt1, *rt2; fl1.fl4_dst = src->ip; fl2.fl4_dst = dst->ip; if (ip_route_output_key(&rt1, &fl1) == 0) { if (ip_route_output_key(&rt2, &fl2) == 0) { if (rt1->rt_gateway == rt2->rt_gateway && rt1->u.dst.dev == rt2->u.dst.dev) ret = 1; dst_release(&rt2->u.dst); } dst_release(&rt1->u.dst); } break; } #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) case AF_INET6: { struct rt6_info *rt1, *rt2; memcpy(&fl1.fl6_dst, src, sizeof(fl1.fl6_dst)); memcpy(&fl2.fl6_dst, dst, sizeof(fl2.fl6_dst)); rt1 = (struct rt6_info *)ip6_route_output(NULL, &fl1); if (rt1) { rt2 = (struct rt6_info *)ip6_route_output(NULL, &fl2); if (rt2) { if (!memcmp(&rt1->rt6i_gateway, &rt2->rt6i_gateway, sizeof(rt1->rt6i_gateway)) && rt1->u.dst.dev == rt2->u.dst.dev) ret = 1; dst_release(&rt2->u.dst); } dst_release(&rt1->u.dst); } break; } #endif } return ret; } /****************************************************************************/ static int expect_callforwarding(struct sk_buff **pskb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, unsigned char **data, int dataoff, TransportAddress *taddr) { int dir = CTINFO2DIR(ctinfo); int ret = 0; __be16 port; union nf_conntrack_address addr; struct nf_conntrack_expect *exp; typeof(nat_callforwarding_hook) nat_callforwarding; /* Read alternativeAddress */ if (!get_h225_addr(ct, *data, taddr, &addr, &port) || port == 0) return 0; /* If the calling party is on the same side of the forward-to party, * we don't need to track the second call */ if (callforward_filter && callforward_do_filter(&addr, &ct->tuplehash[!dir].tuple.src.u3, ct->tuplehash[!dir].tuple.src.l3num)) { DEBUGP("nf_ct_q931: Call Forwarding not tracked\n"); return 0; } /* Create expect for the second call leg */ if ((exp = nf_conntrack_expect_alloc(ct)) == NULL) return -1; nf_conntrack_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num, &ct->tuplehash[!dir].tuple.src.u3, &addr, IPPROTO_TCP, NULL, &port); exp->helper = nf_conntrack_helper_q931; if (memcmp(&ct->tuplehash[dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3, sizeof(ct->tuplehash[dir].tuple.src.u3)) && (nat_callforwarding = rcu_dereference(nat_callforwarding_hook)) && ct->status & IPS_NAT_MASK) { /* Need NAT */ ret = nat_callforwarding(pskb, ct, ctinfo, data, dataoff, taddr, port, exp); } else { /* Conntrack only */ if (nf_conntrack_expect_related(exp) == 0) { DEBUGP("nf_ct_q931: expect Call Forwarding "); NF_CT_DUMP_TUPLE(&exp->tuple); } else ret = -1; } nf_conntrack_expect_put(exp); return ret; } /****************************************************************************/ static int process_setup(struct sk_buff **pskb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, unsigned char **data, int dataoff, Setup_UUIE *setup) { int dir = CTINFO2DIR(ctinfo); int ret; int i; __be16 port; union nf_conntrack_address addr; typeof(set_h225_addr_hook) set_h225_addr; DEBUGP("nf_ct_q931: Setup\n"); if (setup->options & eSetup_UUIE_h245Address) { ret = expect_h245(pskb, ct, ctinfo, data, dataoff, &setup->h245Address); if (ret < 0) return -1; } set_h225_addr = rcu_dereference(set_h225_addr_hook); if ((setup->options & eSetup_UUIE_destCallSignalAddress) && (set_h225_addr) && ct->status && IPS_NAT_MASK && get_h225_addr(ct, *data, &setup->destCallSignalAddress, &addr, &port) && memcmp(&addr, &ct->tuplehash[!dir].tuple.src.u3, sizeof(addr))) { DEBUGP("nf_ct_q931: set destCallSignalAddress " NIP6_FMT ":%hu->" NIP6_FMT ":%hu\n", NIP6(*(struct in6_addr *)&addr), ntohs(port), NIP6(*(struct in6_addr *)&ct->tuplehash[!dir].tuple.src.u3), ntohs(ct->tuplehash[!dir].tuple.src.u.tcp.port)); ret = set_h225_addr(pskb, data, dataoff, &setup->destCallSignalAddress, &ct->tuplehash[!dir].tuple.src.u3, ct->tuplehash[!dir].tuple.src.u.tcp.port); if (ret < 0) return -1; } if ((setup->options & eSetup_UUIE_sourceCallSignalAddress) && (set_h225_addr) && ct->status & IPS_NAT_MASK && get_h225_addr(ct, *data, &setup->sourceCallSignalAddress, &addr, &port) && memcmp(&addr, &ct->tuplehash[!dir].tuple.dst.u3, sizeof(addr))) { DEBUGP("nf_ct_q931: set sourceCallSignalAddress " NIP6_FMT ":%hu->" NIP6_FMT ":%hu\n", NIP6(*(struct in6_addr *)&addr), ntohs(port), NIP6(*(struct in6_addr *)&ct->tuplehash[!dir].tuple.dst.u3), ntohs(ct->tuplehash[!dir].tuple.dst.u.tcp.port)); ret = set_h225_addr(pskb, data, dataoff, &setup->sourceCallSignalAddress, &ct->tuplehash[!dir].tuple.dst.u3, ct->tuplehash[!dir].tuple.dst.u.tcp.port); if (ret < 0) return -1; } if (setup->options & eSetup_UUIE_fastStart) { for (i = 0; i < setup->fastStart.count; i++) { ret = process_olc(pskb, ct, ctinfo, data, dataoff, &setup->fastStart.item[i]); if (ret < 0) return -1; } } return 0; } /****************************************************************************/ static int process_callproceeding(struct sk_buff **pskb, struct nf_conn *ct, enum ip_conntrack_info ctinfo, unsigned char **data, int dataoff, CallProceeding_UUIE *callproc) { int ret; int i; DEBUGP("nf_ct_q931: CallProceeding\n"); if (callproc->options & eCallProceeding_UUIE_h245Address) { ret = expect_h245(pskb, ct, ctinfo, data, dataoff, &callproc->h245Address); if (ret < 0) return -1; } if (callproc->options & eCallProceeding_UUIE_fastStart) { for (i = 0; i < callproc->fastStart.count; i++) {