static int h245_help(struct sk_buff *skb, 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; if (ctinfo != IP_CT_ESTABLISHED && ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) { return NF_ACCEPT; } pr_debug("nf_ct_h245: skblen = %u\n", skb->len); spin_lock_bh(&nf_h323_lock); while (get_tpkt_data(skb, protoff, ct, ctinfo, &data, &datalen, &dataoff)) { pr_debug("nf_ct_h245: TPKT len=%d ", datalen); nf_ct_dump_tuple(&ct->tuplehash[CTINFO2DIR(ctinfo)].tuple); ret = DecodeMultimediaSystemControlMessage(data, datalen, &mscm); if (ret < 0) { pr_debug("nf_ct_h245: decoding error: %s\n", ret == H323_ERROR_BOUND ? "out of bound" : "out of range"); break; } if (process_h245(skb, 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 int q931_help(struct sk_buff *skb, unsigned int protoff, struct nf_conn *ct, enum ip_conntrack_info ctinfo) { static Q931 q931; unsigned char *data = NULL; int datalen = 0; int dataoff = 0; int ret; if (ctinfo != IP_CT_ESTABLISHED && ctinfo != IP_CT_ESTABLISHED_REPLY) return NF_ACCEPT; pr_debug("nf_ct_q931: skblen = %u\n", skb->len); spin_lock_bh(&nf_h323_lock); while (get_tpkt_data(skb, protoff, ct, ctinfo, &data, &datalen, &dataoff)) { pr_debug("nf_ct_q931: TPKT len=%d ", datalen); nf_ct_dump_tuple(&ct->tuplehash[CTINFO2DIR(ctinfo)].tuple); ret = DecodeQ931(data, datalen, &q931); if (ret < 0) { pr_debug("nf_ct_q931: decoding error: %s\n", ret == H323_ERROR_BOUND ? "out of bound" : "out of range"); break; } if (process_q931(skb, ct, ctinfo, &data, dataoff, &q931) < 0) goto drop; } spin_unlock_bh(&nf_h323_lock); return NF_ACCEPT; drop: spin_unlock_bh(&nf_h323_lock); if (net_ratelimit()) pr_info("nf_ct_q931: packet dropped\n"); return NF_DROP; }