IPSEC_PROCFS_DEBUG_NO_STATIC int ipsec_tncfg_show(struct seq_file *seq, void *offset) { int i; char name[9]; struct net_device *dev, *privdev; struct ipsecpriv *priv; KLIPS_PRINT(debug_tunnel & DB_TN_PROCFS, "klips_debug:ipsec_tncfg_show: seq=%p offset=%p\n", seq, offset); for (i = 0; i < IPSEC_NUM_IFMAX; i++) { ipsec_snprintf(name, (ssize_t) sizeof(name), IPSEC_DEV_FORMAT, i); dev = __ipsec_dev_get(name); if (dev) { priv = netdev_to_ipsecpriv(dev); seq_printf(seq, "%s", dev->name); if (priv) { privdev = (struct net_device *)(priv->dev); seq_printf(seq, " -> %s", privdev ? privdev->name : "NULL"); seq_printf(seq, " mtu=%d(%d) -> %d", dev->mtu, priv->mtu, privdev ? privdev->mtu : 0); } else { KLIPS_PRINT(debug_tunnel & DB_TN_PROCFS, "klips_debug:ipsec_tncfg_show: " "device '%s' has no private data space!\n", dev->name); } seq_printf(seq, "\n"); } } return 0; }
/* * This function takes a buffer (with length), a lifetime name and type, * and formats a string to represent the current values of the lifetime. * * It returns the number of bytes that the format took (or would take, * if the buffer were large enough: snprintf semantics). * This is used in /proc routines and in debug output. */ int ipsec_lifetime_format(char *buffer, int buflen, char *lifename, enum ipsec_life_type timebaselife, struct ipsec_lifetime64 *lifetime) { int len = 0; __u64 count; if(timebaselife == ipsec_life_timebased) { count = jiffies/HZ - lifetime->ipl_count; } else { count = lifetime->ipl_count; } if(lifetime->ipl_count > 1 || lifetime->ipl_soft || lifetime->ipl_hard) { #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)) len = ipsec_snprintf(buffer, buflen, "%s(%Lu,%Lu,%Lu)", lifename, count, lifetime->ipl_soft, lifetime->ipl_hard); #else /* XXX high 32 bits are not displayed */ len = ipsec_snprintf(buffer, buflen, "%s(%lu,%lu,%lu)", lifename, (unsigned long)count, (unsigned long)lifetime->ipl_soft, (unsigned long)lifetime->ipl_hard); #endif } return len; }
IPSEC_PROCFS_DEBUG_NO_STATIC int ipsec_xform_get_info(char *buffer, char **start, off_t offset, int length IPSEC_PROC_LAST_ARG) { int len = 0; off_t begin = 0; int i; struct list_head *head; struct ipsec_alg *ixt; KLIPS_PRINT(debug_tunnel & DB_TN_PROCFS, "klips_debug:ipsec_tncfg_get_info: " "buffer=0p%p, *start=0p%p, offset=%d, length=%d\n", buffer, *start, (int)offset, length); for(i = 0, head = ipsec_alg_hash_table; i<IPSEC_ALG_HASHSZ; i++, head++) { struct list_head *p; for (p=head->next; p!=head; p=p->next) { ixt = list_entry(p, struct ipsec_alg, ixt_list); len += ipsec_snprintf(buffer+len, length-len, "VERSION=%d TYPE=%d ID=%d NAME=%s REFCNT=%d ", ixt->ixt_version, ixt->ixt_alg_type, ixt->ixt_support.ias_id, ixt->ixt_name, ixt->ixt_refcnt); len += ipsec_snprintf(buffer+len, length-len, "STATE=%08x BLOCKSIZE=%d IVLEN=%d KEYMINBITS=%d KEYMAXBITS=%d ", ixt->ixt_state, ixt->ixt_blocksize, ixt->ixt_support.ias_ivlen, ixt->ixt_support.ias_keyminbits, ixt->ixt_support.ias_keymaxbits); len += ipsec_snprintf(buffer+len, length-len, "IVLEN=%d KEYMINBITS=%d KEYMAXBITS=%d ", ixt->ixt_support.ias_ivlen, ixt->ixt_support.ias_keyminbits, ixt->ixt_support.ias_keymaxbits); switch(ixt->ixt_alg_type) { case IPSEC_ALG_TYPE_AUTH: { struct ipsec_alg_auth *auth = (struct ipsec_alg_auth *)ixt; len += ipsec_snprintf(buffer+len, length-len, "KEYLEN=%d CTXSIZE=%d AUTHLEN=%d ", auth->ixt_a_keylen, auth->ixt_a_ctx_size, auth->ixt_a_authlen); break; } case IPSEC_ALG_TYPE_ENCRYPT: { struct ipsec_alg_enc *enc = (struct ipsec_alg_enc *)ixt; len += ipsec_snprintf(buffer+len, length-len, "KEYLEN=%d CTXSIZE=%d ", enc->ixt_e_keylen, enc->ixt_e_ctx_size); break; } } len += ipsec_snprintf(buffer+len, length-len, "\n"); } } *start = buffer + (offset - begin); /* Start of wanted data */ len -= (offset - begin); /* Start slop */ if (len > length) len = length; return len; }