/* * Copyright (c) 2012, 2015, The Linux Foundation. All rights reserved. * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all copies. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /** * napt_procfs.c - create files in /proc * */ #include #ifdef KVER32 #include #else #include #include #endif #include #include #include #include #include /* for copy_from_user */ #include "aos_types.h" #ifdef AUTO_UPDATE_PPPOE_INFO #define NF_PROCFS_PERM 0444 #else #define NF_PROCFS_PERM 0644 #endif #define ATHRS17_MAC_LEN 13 // 12+1 #define ATHRS17_IP_LEN 9 // 8+1 #define ATHRS17_CHAR_MAX_LEN ATHRS17_MAC_LEN #define NF_PROCFS_DIR "qca_switch" #define NF_ATHRS17_HNAT_NAME "nf_athrs17_hnat" #define NF_ATHRS17_HNAT_WAN_TYPE_NAME "nf_athrs17_hnat_wan_type" #define NF_ATHRS17_HNAT_PPP_ID_NAME "nf_athrs17_hnat_ppp_id" #define NF_ATHRS17_HNAT_UDP_THRESH_NAME "nf_athrs17_hnat_udp_thresh" #define NF_ATHRS17_HNAT_WAN_IP_NAME "nf_athrs17_hnat_wan_ip" #define NF_ATHRS17_HNAT_PPP_PEER_IP_NAME "nf_athrs17_hnat_ppp_peer_ip" #define NF_ATHRS17_HNAT_PPP_PEER_MAC_NAME "nf_athrs17_hnat_ppp_peer_mac" #define NF_ATHRS17_HNAT_WAN_MAC_NAME "nf_athrs17_hnat_wan_mac" #define NF_ATHRS17_HNAT_PPP_ID2_NAME "nf_athrs17_hnat_ppp_id2" #define NF_ATHRS17_HNAT_PPP_PEER_MAC2_NAME "nf_athrs17_hnat_ppp_peer_mac2" /* for PPPoE */ int nf_athrs17_hnat = 1; int nf_athrs17_hnat_wan_type = 0; int nf_athrs17_hnat_ppp_id = 0; int nf_athrs17_hnat_udp_thresh = 0; a_uint32_t nf_athrs17_hnat_wan_ip = 0; a_uint32_t nf_athrs17_hnat_ppp_peer_ip = 0; unsigned char nf_athrs17_hnat_ppp_peer_mac[ETH_ALEN] = {0}; unsigned char nf_athrs17_hnat_wan_mac[ETH_ALEN] = {0}; extern int nf_athrs17_hnat_sync_counter_en; extern char hnat_log_en; extern int scan_period; extern int scan_enable; extern int napt_need_clean; /* for IPv6 over PPPoE (only for S17c)*/ int nf_athrs17_hnat_ppp_id2 = 0; unsigned char nf_athrs17_hnat_ppp_peer_mac2[ETH_ALEN] = {0}; static void setup_proc_entry(void) { nf_athrs17_hnat = 1; nf_athrs17_hnat_wan_type = 0; nf_athrs17_hnat_ppp_id = 0; memset(&nf_athrs17_hnat_ppp_peer_mac, 0, ETH_ALEN); memset(&nf_athrs17_hnat_wan_mac, 0, ETH_ALEN); nf_athrs17_hnat_ppp_peer_ip = 0; nf_athrs17_hnat_wan_ip = 0; nf_athrs17_hnat_ppp_id2 = 0; memset(&nf_athrs17_hnat_ppp_peer_mac2, 0, ETH_ALEN); nf_athrs17_hnat_sync_counter_en = 0; } #if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0) /** * This structure hold information about the /proc file * */ static struct proc_dir_entry *qca_switch_dir; static struct proc_dir_entry *nf_athrs17_hnat_file; static struct proc_dir_entry *nf_athrs17_hnat_wan_type_file; static struct proc_dir_entry *nf_athrs17_hnat_ppp_id_file; static struct proc_dir_entry *nf_athrs17_hnat_udp_thresh_file; static struct proc_dir_entry *nf_athrs17_hnat_wan_ip_file; static struct proc_dir_entry *nf_athrs17_hnat_ppp_peer_ip_file; static struct proc_dir_entry *nf_athrs17_hnat_ppp_peer_mac_file; static struct proc_dir_entry *nf_athrs17_hnat_wan_mac_file; static struct proc_dir_entry *nf_athrs17_hnat_ppp_id2_file; static struct proc_dir_entry *nf_athrs17_hnat_ppp_peer_mac2_file; /** * This function is called then the /proc file is read * */ static int procfile_read_int(char *page, char **start, off_t off, int count, int *eof, void *data) { int ret; int *prv_data = (int *)data; ret = snprintf(page, sizeof(int), "%d\n", *prv_data); return ret; } static int procfile_read_ip(char *page, char **start, off_t off, int count, int *eof, void *data) { int ret; unsigned char *prv_data = (unsigned char *)data; ret = snprintf(page, sizeof(a_uint32_t), "%d.%d.%d.%d\n", prv_data[0], prv_data[1], prv_data[2], prv_data[3]); return ret; } static int procfile_read_mac(char *page, char **start, off_t off, int count, int *eof, void *data) { int ret; unsigned char *prv_data = (unsigned char *)data; unsigned long long *ptr_ull; ret = snprintf(page, sizeof(unsigned char)*ETH_ALEN, "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x\n", prv_data[0], prv_data[1], prv_data[2], prv_data[3], prv_data[4], prv_data[5]); ptr_ull = (unsigned long long *)prv_data; return ret; } /** * This function is called with the /proc file is written * */ #ifdef AUTO_UPDATE_PPPOE_INFO #define procfile_write_int NULL #define procfile_write_ip NULL #define procfile_write_mac NULL #else static int procfile_write_int(struct file *file, const char *buffer, unsigned long count, void *data) { int len; uint8_t tmp_buf[9] = {'0', '0', '0', '0', '0', '0', '0', '0', '0'}; unsigned int *prv_data = (unsigned int *)data; int res = 0; if(count > sizeof(tmp_buf)) len = sizeof(tmp_buf); else len = count; if(copy_from_user(tmp_buf, buffer, len)) return -EFAULT; tmp_buf[len-1] = '\0'; res = kstrtol((const char *)tmp_buf, 10, prv_data); if(res < 0) return res; // printk("[write] prv_data 0x%p -> 0x%08x\n", prv_data, *prv_data); return len; } static int procfile_write_ip(struct file *file, const char *buffer, unsigned long count, void *data) { int ret; int len; unsigned char tmp_buf[ATHRS17_IP_LEN]; unsigned long *prv_data = (unsigned long *)data; int res = 0; if(count > ATHRS17_IP_LEN) len = ATHRS17_IP_LEN; else len = count; if(copy_from_user(tmp_buf, buffer, len)) return -EFAULT; tmp_buf[len-1] = '\0'; res = kstrtol((const char *)tmp_buf, 16, prv_data); if(res < 0) return res; return ret; } static int procfile_write_mac(struct file *file, const char *buffer, unsigned long count, void *data) { int ret; int len; unsigned char tmp_buf[ATHRS17_MAC_LEN]; unsigned char *ptr_char; unsigned long long *prv_data = (unsigned long long *)data; int res = 0; if(count > ATHRS17_MAC_LEN) len = ATHRS17_MAC_LEN; else len = count; if(copy_from_user((void *)tmp_buf, buffer, len)) return -EFAULT; tmp_buf[len-1] = 't'; res = kstrtoll((const char *)tmp_buf, 16, prv_data); if(res < 0) return res; *prv_data = cpu_to_be64p(prv_data); ptr_char = (unsigned char *)prv_data; ptr_char[0] = ptr_char[2]; ptr_char[1] = ptr_char[3]; ptr_char[2] = ptr_char[4]; ptr_char[3] = ptr_char[5]; ptr_char[4] = ptr_char[6]; ptr_char[5] = ptr_char[7]; return ret; } #endif // ifdef AUTO_UPDATE_PPPOE_INFO int napt_procfs_init(void) { int ret = 0; setup_proc_entry(); /* create directory */ qca_switch_dir = proc_mkdir(NF_PROCFS_DIR, NULL); if(qca_switch_dir == NULL) { ret = -ENOMEM; goto err_out; } /* create the /proc file */ nf_athrs17_hnat_file = create_proc_entry(NF_ATHRS17_HNAT_NAME, 0644, qca_switch_dir); if (NULL == nf_athrs17_hnat_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_NAME); goto no_athrs17_hnat; } nf_athrs17_hnat_file->data = &nf_athrs17_hnat; nf_athrs17_hnat_file->read_proc = procfile_read_int; nf_athrs17_hnat_file->write_proc = procfile_write_int; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_NAME); nf_athrs17_hnat_wan_type_file = create_proc_entry(NF_ATHRS17_HNAT_WAN_TYPE_NAME, NF_PROCFS_PERM, qca_switch_dir); if (NULL == nf_athrs17_hnat_wan_type_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_WAN_TYPE_NAME); goto no_athrs17_hnat_wan_type; } nf_athrs17_hnat_wan_type_file->data = &nf_athrs17_hnat_wan_type; nf_athrs17_hnat_wan_type_file->read_proc = procfile_read_int; nf_athrs17_hnat_wan_type_file->write_proc = procfile_write_int; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_WAN_TYPE_NAME); nf_athrs17_hnat_ppp_id_file = create_proc_entry(NF_ATHRS17_HNAT_PPP_ID_NAME, NF_PROCFS_PERM, qca_switch_dir); if (NULL == nf_athrs17_hnat_ppp_id_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_ID_NAME); goto no_athrs17_hnat_ppp_id; } nf_athrs17_hnat_ppp_id_file->data = &nf_athrs17_hnat_ppp_id; nf_athrs17_hnat_ppp_id_file->read_proc = procfile_read_int; nf_athrs17_hnat_ppp_id_file->write_proc = procfile_write_int; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_ID_NAME); nf_athrs17_hnat_udp_thresh_file = create_proc_entry(NF_ATHRS17_HNAT_UDP_THRESH_NAME, NF_PROCFS_PERM, qca_switch_dir); if (NULL == nf_athrs17_hnat_udp_thresh_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_UDP_THRESH_NAME); goto no_athrs17_hnat_udp_thresh; } nf_athrs17_hnat_udp_thresh_file->data = &nf_athrs17_hnat_udp_thresh; nf_athrs17_hnat_udp_thresh_file->read_proc = procfile_read_int; nf_athrs17_hnat_udp_thresh_file->write_proc = procfile_write_int; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_UDP_THRESH_NAME); nf_athrs17_hnat_wan_ip_file = create_proc_entry(NF_ATHRS17_HNAT_WAN_IP_NAME, NF_PROCFS_PERM, qca_switch_dir); if (NULL == nf_athrs17_hnat_wan_ip_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_WAN_IP_NAME); goto no_athrs17_hnat_wan_ip; } nf_athrs17_hnat_wan_ip_file->data = &nf_athrs17_hnat_wan_ip; nf_athrs17_hnat_wan_ip_file->read_proc = procfile_read_ip; nf_athrs17_hnat_wan_ip_file->write_proc = procfile_write_ip; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_WAN_IP_NAME); nf_athrs17_hnat_ppp_peer_ip_file = create_proc_entry(NF_ATHRS17_HNAT_PPP_PEER_IP_NAME, NF_PROCFS_PERM, qca_switch_dir); if (NULL == nf_athrs17_hnat_ppp_peer_ip_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_PEER_IP_NAME); goto no_athrs17_hnat_ppp_peer_ip; } nf_athrs17_hnat_ppp_peer_ip_file->data = &nf_athrs17_hnat_ppp_peer_ip; nf_athrs17_hnat_ppp_peer_ip_file->read_proc = procfile_read_ip; nf_athrs17_hnat_ppp_peer_ip_file->write_proc = procfile_write_ip; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_PEER_IP_NAME); nf_athrs17_hnat_ppp_peer_mac_file = create_proc_entry(NF_ATHRS17_HNAT_PPP_PEER_MAC_NAME, NF_PROCFS_PERM, qca_switch_dir); if (NULL == nf_athrs17_hnat_ppp_peer_mac_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_PEER_MAC_NAME); goto no_athrs17_hnat_ppp_peer_mac; } nf_athrs17_hnat_ppp_peer_mac_file->data = &nf_athrs17_hnat_ppp_peer_mac; nf_athrs17_hnat_ppp_peer_mac_file->read_proc = procfile_read_mac; nf_athrs17_hnat_ppp_peer_mac_file->write_proc = procfile_write_mac; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_PEER_MAC_NAME); nf_athrs17_hnat_wan_mac_file = create_proc_entry(NF_ATHRS17_HNAT_WAN_MAC_NAME, NF_PROCFS_PERM, qca_switch_dir); if (NULL == nf_athrs17_hnat_wan_mac_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_WAN_MAC_NAME); goto no_athrs17_hnat_wan_mac; } nf_athrs17_hnat_wan_mac_file->data = &nf_athrs17_hnat_wan_mac; nf_athrs17_hnat_wan_mac_file->read_proc = procfile_read_mac; nf_athrs17_hnat_wan_mac_file->write_proc = procfile_write_mac; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_WAN_MAC_NAME); nf_athrs17_hnat_ppp_id2_file = create_proc_entry(NF_ATHRS17_HNAT_PPP_ID2_NAME, NF_PROCFS_PERM, qca_switch_dir); if (NULL == nf_athrs17_hnat_ppp_id2_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_ID2_NAME); goto no_athrs17_hnat_ppp_id; } nf_athrs17_hnat_ppp_id2_file->data = &nf_athrs17_hnat_ppp_id2; nf_athrs17_hnat_ppp_id2_file->read_proc = procfile_read_int; nf_athrs17_hnat_ppp_id2_file->write_proc = procfile_write_int; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_ID2_NAME); nf_athrs17_hnat_ppp_peer_mac2_file = create_proc_entry(NF_ATHRS17_HNAT_PPP_PEER_MAC2_NAME, NF_PROCFS_PERM, qca_switch_dir); if (NULL == nf_athrs17_hnat_ppp_peer_mac2_file) { printk("Error: Can not create /proc/%s/%s\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_PEER_MAC2_NAME); goto no_athrs17_hnat_ppp_peer_mac; } nf_athrs17_hnat_ppp_peer_mac2_file->data = &nf_athrs17_hnat_ppp_peer_mac2; nf_athrs17_hnat_ppp_peer_mac2_file->read_proc = procfile_read_mac; nf_athrs17_hnat_ppp_peer_mac2_file->write_proc = procfile_write_mac; printk("/proc/%s/%s is created\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_PPP_PEER_MAC_NAME); return 0; no_athrs17_hnat_wan_mac: remove_proc_entry(NF_ATHRS17_HNAT_PPP_PEER_MAC_NAME, qca_switch_dir); no_athrs17_hnat_ppp_peer_mac: remove_proc_entry(NF_ATHRS17_HNAT_PPP_PEER_IP_NAME, qca_switch_dir); no_athrs17_hnat_ppp_peer_ip: remove_proc_entry(NF_ATHRS17_HNAT_WAN_IP_NAME, qca_switch_dir); no_athrs17_hnat_wan_ip: remove_proc_entry(NF_ATHRS17_HNAT_UDP_THRESH_NAME, qca_switch_dir); no_athrs17_hnat_udp_thresh: remove_proc_entry(NF_ATHRS17_HNAT_PPP_ID_NAME, qca_switch_dir); no_athrs17_hnat_ppp_id: remove_proc_entry(NF_ATHRS17_HNAT_WAN_TYPE_NAME, qca_switch_dir); no_athrs17_hnat_wan_type: remove_proc_entry(NF_ATHRS17_HNAT_NAME, qca_switch_dir); no_athrs17_hnat: remove_proc_entry(NF_PROCFS_DIR, NULL); err_out: return ret; } void napt_procfs_exit(void) { remove_proc_entry(NF_ATHRS17_HNAT_NAME, qca_switch_dir); remove_proc_entry(NF_ATHRS17_HNAT_WAN_TYPE_NAME, qca_switch_dir); remove_proc_entry(NF_ATHRS17_HNAT_PPP_ID_NAME, qca_switch_dir); remove_proc_entry(NF_ATHRS17_HNAT_UDP_THRESH_NAME, qca_switch_dir); remove_proc_entry(NF_ATHRS17_HNAT_WAN_IP_NAME, qca_switch_dir); remove_proc_entry(NF_ATHRS17_HNAT_PPP_PEER_IP_NAME, qca_switch_dir); remove_proc_entry(NF_ATHRS17_HNAT_PPP_PEER_MAC_NAME, qca_switch_dir); remove_proc_entry(NF_ATHRS17_HNAT_WAN_MAC_NAME, qca_switch_dir); remove_proc_entry(NF_ATHRS17_HNAT_PPP_ID2_NAME, qca_switch_dir); remove_proc_entry(NF_ATHRS17_HNAT_PPP_PEER_MAC2_NAME, qca_switch_dir); remove_proc_entry(NF_PROCFS_DIR, NULL); printk(KERN_INFO "/proc/%s/%s removed\n", NF_PROCFS_DIR, NF_ATHRS17_HNAT_NAME); } #else static ssize_t napt_hnat_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)nf_athrs17_hnat; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_hnat_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); nf_athrs17_hnat = num; return count; } static ssize_t napt_wan_type_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)nf_athrs17_hnat_wan_type; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_wan_type_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); nf_athrs17_hnat_wan_type = num; return count; } static ssize_t napt_ppp_id_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)nf_athrs17_hnat_ppp_id; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_ppp_id_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); nf_athrs17_hnat_ppp_id = num; return count; } static ssize_t napt_udp_thresh_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)nf_athrs17_hnat_udp_thresh; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_udp_thresh_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); nf_athrs17_hnat_udp_thresh = num; return count; } static ssize_t napt_wan_ip_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; unsigned char* data; data = (unsigned char*)&nf_athrs17_hnat_wan_ip; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%d.%d.%d.%d", data[0], data[1], data[2], data[3]); return count; } static ssize_t napt_wan_ip_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); nf_athrs17_hnat_wan_ip = num; return count; } static ssize_t napt_ppp_peer_ip_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; unsigned char* data; data = (unsigned char*)&nf_athrs17_hnat_ppp_peer_ip; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%d.%d.%d.%d", data[0], data[1], data[2], data[3]); return count; } static ssize_t napt_ppp_peer_ip_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); nf_athrs17_hnat_ppp_peer_ip = num; return count; } static ssize_t napt_peer_mac_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; unsigned char* data; data = (unsigned char*)&nf_athrs17_hnat_ppp_peer_mac; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x", data[0], data[1], data[2], data[3], data[4], data[5]); return count; } static ssize_t napt_peer_mac_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[32]; unsigned long long prv_data; unsigned char *ptr_char; int res = 0; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; res = kstrtoll((const char *)num_buf, 16, &prv_data); if(res < 0) return res; prv_data = cpu_to_be64p(&prv_data); ptr_char = (unsigned char *)&prv_data; nf_athrs17_hnat_ppp_peer_mac[0] = ptr_char[2]; nf_athrs17_hnat_ppp_peer_mac[1] = ptr_char[3]; nf_athrs17_hnat_ppp_peer_mac[2] = ptr_char[4]; nf_athrs17_hnat_ppp_peer_mac[3] = ptr_char[5]; nf_athrs17_hnat_ppp_peer_mac[4] = ptr_char[6]; nf_athrs17_hnat_ppp_peer_mac[5] = ptr_char[7]; return count; } static ssize_t napt_wan_mac_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; unsigned char* data; data = (unsigned char*)&nf_athrs17_hnat_wan_mac; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x", data[0], data[1], data[2], data[3], data[4], data[5]); return count; } static ssize_t napt_wan_mac_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[32]; unsigned long long prv_data; unsigned char *ptr_char; int res = 0; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; res = kstrtoll((const char *)num_buf, 16, &prv_data); if(res < 0) return res; prv_data = cpu_to_be64p(&prv_data); ptr_char = (unsigned char *)&prv_data; nf_athrs17_hnat_wan_mac[0] = ptr_char[2]; nf_athrs17_hnat_wan_mac[1] = ptr_char[3]; nf_athrs17_hnat_wan_mac[2] = ptr_char[4]; nf_athrs17_hnat_wan_mac[3] = ptr_char[5]; nf_athrs17_hnat_wan_mac[4] = ptr_char[6]; nf_athrs17_hnat_wan_mac[5] = ptr_char[7]; return count; } static ssize_t napt_peer_mac2_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; unsigned char* data; data = (unsigned char*)&nf_athrs17_hnat_ppp_peer_mac2; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x", data[0], data[1], data[2], data[3], data[4], data[5]); return count; } static ssize_t napt_peer_mac2_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[32]; unsigned long long prv_data; unsigned char *ptr_char; int res = 0; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; res = kstrtoll((const char *)num_buf, 16, &prv_data); if(res < 0) return res; prv_data = cpu_to_be64p(&prv_data); ptr_char = (unsigned char *)&prv_data; nf_athrs17_hnat_ppp_peer_mac2[0] = ptr_char[2]; nf_athrs17_hnat_ppp_peer_mac2[1] = ptr_char[3]; nf_athrs17_hnat_ppp_peer_mac2[2] = ptr_char[4]; nf_athrs17_hnat_ppp_peer_mac2[3] = ptr_char[5]; nf_athrs17_hnat_ppp_peer_mac2[4] = ptr_char[6]; nf_athrs17_hnat_ppp_peer_mac2[5] = ptr_char[7]; return count; } static ssize_t napt_ppp_id2_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)nf_athrs17_hnat_ppp_id2; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_ppp_id2_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); nf_athrs17_hnat_ppp_id2 = num; return count; } static ssize_t napt_sync_counter_en_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)nf_athrs17_hnat_sync_counter_en; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_sync_counter_en_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); nf_athrs17_hnat_sync_counter_en = num; return count; } static ssize_t napt_log_en_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)hnat_log_en; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_log_en_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); hnat_log_en = num; return count; } static ssize_t napt_scan_period_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)scan_period; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_scan_period_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); scan_period = num; return count; } static ssize_t napt_scan_enable_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)scan_enable; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_scan_enable_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); scan_enable = num; return count; } static ssize_t napt_need_clean_get(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t count; a_uint32_t num; num = (a_uint32_t)napt_need_clean; count = snprintf(buf, (ssize_t)PAGE_SIZE, "%u", num); return count; } static ssize_t napt_need_clean_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { char num_buf[12]; a_uint32_t num; if (count >= sizeof(num_buf)) return 0; memcpy(num_buf, buf, count); num_buf[count] = '\0'; sscanf(num_buf, "%u", &num); napt_need_clean = num; return count; } extern void napt_helper_show(void); static ssize_t napt_log_show_get(struct device *dev, struct device_attribute *attr, char *buf) { napt_helper_show(); return 0; } struct kobject *napt_sys = NULL; static const struct device_attribute napt_hnat_attr = __ATTR(hnat, S_IWUGO | S_IRUGO, napt_hnat_get, napt_hnat_set); static const struct device_attribute napt_wan_type_attr = __ATTR(wan_type, S_IWUGO | S_IRUGO, napt_wan_type_get, napt_wan_type_set); static const struct device_attribute napt_ppp_id_attr = __ATTR(ppp_id, S_IWUGO | S_IRUGO, napt_ppp_id_get, napt_ppp_id_set); static const struct device_attribute napt_udp_thresh_attr = __ATTR(udp_thresh, S_IWUGO | S_IRUGO, napt_udp_thresh_get, napt_udp_thresh_set); static const struct device_attribute napt_wan_ip_attr = __ATTR(wan_ip, S_IWUGO | S_IRUGO, napt_wan_ip_get, napt_wan_ip_set); static const struct device_attribute napt_ppp_peer_ip_attr = __ATTR(peer_ip, S_IWUGO | S_IRUGO, napt_ppp_peer_ip_get, napt_ppp_peer_ip_set); static const struct device_attribute napt_ppp_peer_mac_attr = __ATTR(peer_mac, S_IWUGO | S_IRUGO, napt_peer_mac_get, napt_peer_mac_set); static const struct device_attribute napt_wan_mac_attr = __ATTR(wan_mac, S_IWUGO | S_IRUGO, napt_wan_mac_get, napt_wan_mac_set); static const struct device_attribute napt_ppp_id2_attr = __ATTR(ppp_id2, S_IWUGO | S_IRUGO, napt_ppp_id2_get, napt_ppp_id2_set); static const struct device_attribute napt_ppp_peer_mac2_attr = __ATTR(peer_mac2, S_IWUGO | S_IRUGO, napt_peer_mac2_get, napt_peer_mac2_set); static const struct device_attribute napt_sync_counter_en_attr = __ATTR(sync_counter_en, S_IWUGO | S_IRUGO, napt_sync_counter_en_get, napt_sync_counter_en_set); static const struct device_attribute napt_log_en_attr = __ATTR(log_en, S_IWUGO | S_IRUGO, napt_log_en_get, napt_log_en_set); static const struct device_attribute napt_log_show_attr = __ATTR(log_show, S_IWUGO | S_IRUGO, napt_log_show_get, NULL); static const struct device_attribute napt_scan_period_attr = __ATTR(speriod, S_IWUGO | S_IRUGO, napt_scan_period_get, napt_scan_period_set); static const struct device_attribute napt_scan_enable_attr = __ATTR(scan_en, S_IWUGO | S_IRUGO, napt_scan_enable_get, napt_scan_enable_set); static const struct device_attribute napt_need_clean_attr = __ATTR(napt_clean, S_IWUGO | S_IRUGO, napt_need_clean_get, napt_need_clean_set); int napt_procfs_init(void) { int ret = 0; napt_sys = kobject_create_and_add("ssdk_napt", NULL); if (!napt_sys) { printk("napt failed to register sysfs\n "); return ret; } ret = sysfs_create_file(napt_sys, &napt_hnat_attr.attr); if (ret) { printk("Failed to register hnat SysFS file\n"); goto CLEANUP_1; } ret = sysfs_create_file(napt_sys, &napt_wan_type_attr.attr); if (ret) { printk("Failed to register wan type SysFS file\n"); goto CLEANUP_2; } ret = sysfs_create_file(napt_sys, &napt_ppp_id_attr.attr); if (ret) { printk("Failed to register ppp id SysFS file\n"); goto CLEANUP_3; } ret = sysfs_create_file(napt_sys, &napt_udp_thresh_attr.attr); if (ret) { printk("Failed to register udp thresh SysFS file\n"); goto CLEANUP_4; } ret = sysfs_create_file(napt_sys, &napt_wan_ip_attr.attr); if (ret) { printk("Failed to register wan ip SysFS file\n"); goto CLEANUP_5; } ret = sysfs_create_file(napt_sys, &napt_ppp_peer_ip_attr.attr); if (ret) { printk("Failed to register ppp peer ip SysFS file\n"); goto CLEANUP_6; } ret = sysfs_create_file(napt_sys, &napt_ppp_peer_mac_attr.attr); if (ret) { printk("Failed to register ppp peer mac SysFS file\n"); goto CLEANUP_7; } ret = sysfs_create_file(napt_sys, &napt_wan_mac_attr.attr); if (ret) { printk("Failed to register wan mac SysFS file\n"); goto CLEANUP_8; } ret = sysfs_create_file(napt_sys, &napt_ppp_id2_attr.attr); if (ret) { printk("Failed to register ppp id2 SysFS file\n"); goto CLEANUP_9; } ret = sysfs_create_file(napt_sys, &napt_ppp_peer_mac2_attr.attr); if (ret) { printk("Failed to register ppp peer mac2 SysFS file\n"); goto CLEANUP_10; } ret = sysfs_create_file(napt_sys, &napt_sync_counter_en_attr.attr); if (ret) { printk("Failed to register sync counter en SysFS file\n"); goto CLEANUP_11; } ret = sysfs_create_file(napt_sys, &napt_log_en_attr.attr); if (ret) { printk("Failed to register log en SysFS file\n"); goto CLEANUP_12; } ret = sysfs_create_file(napt_sys, &napt_log_show_attr.attr); if (ret) { printk("Failed to register log show SysFS file\n"); goto CLEANUP_13; } ret = sysfs_create_file(napt_sys, &napt_scan_period_attr.attr); if (ret) { printk("Failed to register scan period SysFS file\n"); goto CLEANUP_14; } ret = sysfs_create_file(napt_sys, &napt_scan_enable_attr.attr); if (ret) { printk("Failed to register scan enable SysFS file\n"); goto CLEANUP_15; } ret = sysfs_create_file(napt_sys, &napt_need_clean_attr.attr); if (ret) { printk("Failed to register napt clean SysFS file\n"); goto CLEANUP_16; } return 0; CLEANUP_16: sysfs_remove_file(napt_sys, &napt_scan_enable_attr.attr); CLEANUP_15: sysfs_remove_file(napt_sys, &napt_scan_period_attr.attr); CLEANUP_14: sysfs_remove_file(napt_sys, &napt_log_show_attr.attr); CLEANUP_13: sysfs_remove_file(napt_sys, &napt_log_en_attr.attr); CLEANUP_12: sysfs_remove_file(napt_sys, &napt_sync_counter_en_attr.attr); CLEANUP_11: sysfs_remove_file(napt_sys, &napt_ppp_peer_mac2_attr.attr); CLEANUP_10: sysfs_remove_file(napt_sys, &napt_ppp_id2_attr.attr); CLEANUP_9: sysfs_remove_file(napt_sys, &napt_wan_mac_attr.attr); CLEANUP_8: sysfs_remove_file(napt_sys, &napt_ppp_peer_mac_attr.attr); CLEANUP_7: sysfs_remove_file(napt_sys, &napt_ppp_peer_ip_attr.attr); CLEANUP_6: sysfs_remove_file(napt_sys, &napt_wan_ip_attr.attr); CLEANUP_5: sysfs_remove_file(napt_sys, &napt_udp_thresh_attr.attr); CLEANUP_4: sysfs_remove_file(napt_sys, &napt_ppp_id_attr.attr); CLEANUP_3: sysfs_remove_file(napt_sys, &napt_wan_type_attr.attr); CLEANUP_2: sysfs_remove_file(napt_sys, &napt_hnat_attr.attr); CLEANUP_1: kobject_put(napt_sys); return ret; } void napt_procfs_exit(void) { printk("napt procfs exit\n"); sysfs_remove_file(napt_sys, &napt_need_clean_attr.attr); sysfs_remove_file(napt_sys, &napt_scan_enable_attr.attr); sysfs_remove_file(napt_sys, &napt_scan_period_attr.attr); sysfs_remove_file(napt_sys, &napt_log_show_attr.attr); sysfs_remove_file(napt_sys, &napt_log_en_attr.attr); sysfs_remove_file(napt_sys, &napt_sync_counter_en_attr.attr); sysfs_remove_file(napt_sys, &napt_ppp_peer_mac2_attr.attr); sysfs_remove_file(napt_sys, &napt_ppp_id2_attr.attr); sysfs_remove_file(napt_sys, &napt_wan_mac_attr.attr); sysfs_remove_file(napt_sys, &napt_ppp_peer_mac_attr.attr); sysfs_remove_file(napt_sys, &napt_ppp_peer_ip_attr.attr); sysfs_remove_file(napt_sys, &napt_wan_ip_attr.attr); sysfs_remove_file(napt_sys, &napt_udp_thresh_attr.attr); sysfs_remove_file(napt_sys, &napt_ppp_id_attr.attr); sysfs_remove_file(napt_sys, &napt_wan_type_attr.attr); sysfs_remove_file(napt_sys, &napt_hnat_attr.attr); kobject_put(napt_sys); } #endif