예제 #1
0
static void __exit kmem_exit(void)
{
	PR_INFO("start");
	kmem_cache_free(cache_p, p);
	kmem_cache_destroy(cache_p);
	PR_INFO("end");
}
예제 #2
0
/*
* The release implementation.
*/
static int kern_release(struct inode *inode, struct file *filp)
{
	PR_INFO("start");
	ssleep(2);
	PR_INFO("end");
	return 0;
}
예제 #3
0
파일: nfct.c 프로젝트: crs-chin/lavender
static int nfct_parse(ginkgo_msg *msg)
{
    struct nlmsghdr *nlh = NL_HEADER(msg);
    nfct_msg *ctmsg = NFCT_MSG(msg);
    __u16 nlm_type = nlh->nlmsg_type;
    __u16 type = NFNL_MSG_TYPE(nlh->nlmsg_type);
    __u16 subsys = NFNL_SUBSYS_ID(nlh->nlmsg_type);

    if(nlm_type <= NLMSG_MIN_TYPE)
        return -1;

    ctmsg->subsys = subsys;
    ctmsg->type = type;
    ctmsg->entry = NULL;
    if(ctmsg->subsys != NFNL_SUBSYS_CTNETLINK)  {
        PR_INFO("not supported subsys message type parsing:%d %d", subsys, type);
        return 0;
    }
    switch(type)  {
    case IPCTNL_MSG_CT_NEW:
    case IPCTNL_MSG_CT_DELETE:
        return nfct_parse_ct(ctmsg, nlh);
    default:
        PR_INFO("unpexpected ct msg type:%d", type);
        break;
    }
    return 0;
}
예제 #4
0
/* our own functions */
static void api_print_addressinfo(void *logical_adr)
{
	struct page *page = virt_to_page(logical_adr);

	if (page == NULL) {
		PR_INFO("unable to translate address %p to page", logical_adr);
		return;
	}
	PR_INFO(
	"address %p, page:%p flags:0x%0*lx mapping:%p mapcount:%d count:%d\n",
		logical_adr,
		page, (int)(2 * sizeof(unsigned long)),
		page->flags, page->mapping,
		page_mapcount(page), page_count(page)
	);

	PR_INFO("PG_lru is %lu", page->flags & (1 << PG_lru));
	PR_INFO("PG_private is %lu", page->flags & (1 << PG_private));
	PR_INFO("PG_locked is %lu", page->flags & (1 << PG_locked));
	/* Missing in newer kernels and so is remarked... */
	/* PR_INFO("PG_buddy is %lu", page->flags & (1 << PG_buddy)); */
	PR_INFO("PG_writeback is %lu", page->flags & (1 << PG_writeback));
	PR_INFO("PG_slab is %lu", page->flags & (1 << PG_slab));
	PR_INFO("PG_swapcache is %lu", page->flags & (1 << PG_swapcache));
	PR_INFO("PG_active is %lu", page->flags & (1 << PG_active));
	PR_INFO("PG_reserved is %lu", page->flags & (1 << PG_reserved));
}
예제 #5
0
/* our own functions */
static int __init kmem_init(void)
{
	PR_INFO("start");
	cache_p = kmem_cache_create(
		/* name of cache (will appear in slabtop(1),
		/proc/slabinfo and more. */
		"veltzer",
		/* size of objects in cache */
		100,
		/* alignment */
		0,
		/* flags (look at the docs, will you ?) */
		SLAB_HWCACHE_ALIGN | SLAB_DEBUG_OBJECTS,
		/* ctor/dtor to be called when each element is allocated
		or deallocated */
		NULL
	);
	if (IS_ERR(cache_p))
		return PTR_ERR(cache_p);
	p = kmem_cache_alloc(cache_p, GFP_KERNEL);
	if (IS_ERR(p)) {
		/* there is not too much that we can do here */
		PR_ERROR("Cannot allocate memory");
		kmem_cache_destroy(cache_p);
		return PTR_ERR(p);
	}
	/* mempool_create(number,mempool_alloc_slab, mempool_free_slab,
			drbd_request_cache); */
	PR_INFO("end");
	return 0;
}
예제 #6
0
static int
knamed_loop(void *data)
{
    allow_signal(SIGHUP);

    while (1) {
        set_current_state(TASK_INTERRUPTIBLE);

        if (kthread_should_stop()) {
            break;
        }

        if (signal_pending(current)) {
            flush_signals(current);

            PR_INFO("SIGNAL received");
        }

        PR_INFO("Hello knamed_task");

        schedule_timeout(5 * HZ);
    }

    knamed_task = NULL;

    complete_and_exit(&comp, 0);
}
예제 #7
0
static void param_exit(void)
{
	PR_INFO("start");
	PR_INFO("myshort is a short integer: %hd", myshort);
	PR_INFO("myint is an integer: %d", myint);
	PR_INFO("mylong is a long integer: %ld", mylong);
	PR_INFO("mystring is a string: %s", mystring);
}
// for uplink GTPU traffic on S-GW
//-----------------------------------------------------------------------------
static int _udp_thread(void *data)
//-----------------------------------------------------------------------------
{
  int size, tx_size;
  int bufsize       = 8192;
#if defined(FLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT)
  int success_read  = 0;
  int failed_read   = 0;
#endif
  unsigned char buf[bufsize+1];
  unsigned char gtp_resp[1024];

  /* kernel thread initialization */
  _gtpusp_sock.running = 1;

  PR_INFO(MODULE_NAME": listening on port %d\n", gtpu_sgw_port);

  /* main loop */
  while(_gtpusp_sock.thread_stop_requested == 0){
    if (kthread_should_stop()) {
    	_gtpusp_sock.running = 0;
    	PR_INFO(MODULE_NAME": kthread_stop initiated exit at %lu \n", jiffies);
		return -1; //Exit from the thread. Return value will be passed to kthread_stop()
    }
	size = _gtpusp_ksocket_receive(_gtpusp_sock.sock, &_gtpusp_sock.addr, buf, bufsize);

	if (size <= 0) {
	  if (size != -EAGAIN) {
        pr_info(MODULE_NAME": error getting datagram, sock_recvmsg error = %d\n", size);
	  }
#if defined(FLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT)
	  success_read  = 0;
	  failed_read  += 1;
	  if (failed_read > 10) failed_read = 10;
      usleep_range(failed_read*20,failed_read*200);
#endif
    } else {
#if defined(FLAG_GTPV1U_KERNEL_THREAD_SOCK_NO_WAIT)
      success_read += 1;
      failed_read   = 0;
#endif
      PR_INFO(MODULE_NAME": received %d bytes\n", size);

      if ((tx_size = _gtpusp_ksocket_process_gtp(buf, size, gtp_resp)) > 0) {
        //ksocket_send(_gtpusp_sock.sock, &_gtpusp_sock.addr_send, buf, gtp_resp, tx_size, NULL, 0));
      }
    }
  }
  _gtpusp_sock.running = 0;
  if (kthread_should_stop()) {
    PR_INFO(MODULE_NAME": kthread_stop initiated exit at %lu \n", jiffies);
    return -1; //Exit from the thread. Return value will be passed to kthread_stop()
  }
  PR_INFO(MODULE_NAME": kthread do_exit()\n");
  do_exit(0);
}
예제 #9
0
static void api_debug_address(unsigned int phys)
{
	void *logical = __va(phys);
	void *logical2 = phys_to_virt(phys);
	unsigned int phys2 = __pa(logical);

	PR_INFO("phys is %u", phys);
	PR_INFO("logical is %p", logical);
	PR_INFO("phys2 is %u", phys2);
	PR_INFO("logical2 is %p", logical2);
	api_print_addressinfo(logical);
}
//-----------------------------------------------------------------------------
static void
_gtpusp_tg4_add(struct sk_buff *old_skb_pP, const struct xt_action_param *par_pP)
{
  //-----------------------------------------------------------------------------
  struct iphdr   *old_iph_p       = ip_hdr(old_skb_pP);
  struct gtpuhdr  gtpuh;
  uint16_t        orig_iplen = 0;
  // CONNMARK
  enum ip_conntrack_info ctinfo;
  struct nf_conn *ct = NULL;
  u_int32_t newmark;

  if (skb_linearize(old_skb_pP) < 0) {
	PR_INFO(MODULE_NAME": skb no linearize\n");
    return;
  }
  orig_iplen = ntohs(old_iph_p->tot_len);

  //----------------------------------------------------------------------------
  // CONNMARK
  //----------------------------------------------------------------------------
  ct = nf_ct_get(old_skb_pP, &ctinfo);
  if (ct == NULL) {
    PR_INFO(MODULE_NAME": _gtpusp_target_add force targinfo ltun %u to skb_pP mark %u\n",
	            ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->ltun,
	            old_skb_pP->mark);
    newmark = ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->ltun;
  } else {
    //XT_CONNMARK_RESTORE:
    newmark          = old_skb_pP->mark ^ ct->mark;

    PR_INFO(MODULE_NAME": _gtpusp_target_add restore mark %u (skb mark %u ct mark %u) len %u sgw addr %x\n",
			newmark, old_skb_pP->mark, ct->mark, orig_iplen,
			((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->raddr);
    if (newmark != ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->ltun) {
  	  pr_warn(MODULE_NAME": _gtpusp_target_add restore mark 0x%x mismatch ltun 0x%x (rtun 0x%x)",
  			newmark, ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->ltun,
  			 ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->rtun);
    }
  }


  /* Add GTPu header */
  gtpuh.flags   = 0x30; /* v1 and Protocol-type=GTP */
  gtpuh.msgtype = 0xff; /* T-PDU */
  gtpuh.length  = htons(orig_iplen);
  gtpuh.tunid   = htonl(((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->rtun);

  _gtpusp_sock.addr_send.sin_addr.s_addr = ((const struct xt_gtpusp_target_info *)(par_pP->targinfo))->raddr;
  _gtpusp_ksocket_send(_gtpusp_sock.sock, &_gtpusp_sock.addr_send, (unsigned char*)&gtpuh, sizeof(gtpuh), (unsigned char*)old_iph_p, orig_iplen);
  return ;
}
예제 #11
0
/*
 * This is the poll implementation
 */
static unsigned int kern_poll(struct file *fp, poll_table *wait)
{
	struct polldev *pd;
	pd = (struct polldev *)fp->private_data;
	PR_INFO("start %p", pd);
	poll_wait(fp, &pd->wq, wait);
	unsigned int mask = pd->state;
	/* no need to reset the state
	pd->state = 0;
	*/
	PR_INFO("return with %u", mask);
	return mask;
}
예제 #12
0
static int __init mod_init(void)
{
	PR_DEBUG("start");
	api_debug_address(physaddr);

	/*
	* if (!request_mem_region(physaddr,size,)) {
	*	PR_ERROR("could not get the memory");
	*	return 1;
	* }
	*/
	logical = ioremap(physaddr, size);
	if (IS_ERR(logical)) {
		pr_err("could not ioremap");
		release_mem_region(physaddr, size);
		return PTR_ERR(logical);
	}
	PR_INFO("got logical address %p", logical);
	/* memset(logical,0,size);
	*logical=5;
	PR_INFO("read %c",*logical);
	logical=phys_to_virt(physaddr);
	for(i=0;i<170*1024*1024;i++)
		logical[i]=0;
	api_print_addressinfo((void*)(1024*1024*700));
	api_print_addressinfo((void*)(1024*1024*695));
	api_print_addressinfo((void*)(1024*1024*720));
	*/
	return 0;
}
예제 #13
0
static int param_init(void)
{
	PR_INFO("start");
	PR_INFO("myshort is a short integer: %hd", myshort);
	PR_INFO("myint is an integer: %d", myint);
	PR_INFO("mylong is a long integer: %ld", mylong);
	PR_INFO("mystring is a string: %s", mystring);
	PR_INFO("You may change some of the values now via /sys and see");
	PR_INFO("the values changed");
	PR_INFO("either by catting /sys or unloading the module and");
	PR_INFO("looking at the unload printout...");
	return 0;
}
//-----------------------------------------------------------------------------
static int
__init gtpusp_tg_init(void)
//-----------------------------------------------------------------------------
{
  int            err;

  pr_info(MODULE_NAME": Initializing module (KVersion: %d)\n", KVERSION);
  pr_info(MODULE_NAME": Copyright Polaris Networks 2010-2011\n");
  pr_info(MODULE_NAME": Modified by EURECOM Lionel GAUTHIER 2014\n");
#ifndef CMAKER
  pr_info(MODULE_NAME": Compiled %s at time %s\n",__DATE__,__TIME__);
#endif
#if defined(WITH_IPV6)
  pr_info(MODULE_NAME": IPv4/IPv6 enabled\n");
#else
  pr_info(MODULE_NAME": IPv4 only enabled\n");
#endif
  pr_info(MODULE_NAME": params gtpu_enb_port=%u, gtpu_sgw_port=%u, sgw_addr=%s\n",
		  gtpu_enb_port, gtpu_sgw_port, sgw_addr);

  // UDP socket socket
  memset(&_gtpusp_sock, 0, sizeof(gtpusp_sock_t));

  /* create a socket */
  if ((err = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &_gtpusp_sock.sock)) < 0 ) {
	PR_INFO(": Could not create a datagram socket, error = %d\n", -ENXIO);
	return err;
  }

  _gtpusp_sock.addr.sin_family = AF_INET;
  _gtpusp_sock.addr.sin_port   = htons(gtpu_sgw_port);
  _gtpusp_sock.addr.sin_addr.s_addr   = in_aton(sgw_addr);

  _gtpusp_sock.addr_send.sin_family      = AF_INET;
  _gtpusp_sock.addr_send.sin_port        = htons(gtpu_enb_port);
  _gtpusp_sock.addr_send.sin_addr.s_addr = in_aton(sgw_addr);

  _gtpusp_sock.thread_stop_requested     = 0;

  if ( (err = _gtpusp_sock.sock->ops->bind(_gtpusp_sock.sock, (struct sockaddr *)&_gtpusp_sock.addr, sizeof(struct sockaddr) ) ) < 0) {
    pr_info(MODULE_NAME": Could not bind socket, error = %d\n", -err);
    goto close_and_out;
  }

  // start kernel thread
  _gtpusp_sock.thread = kthread_run((void *)_udp_thread, NULL, MODULE_NAME);
  if (IS_ERR(_gtpusp_sock.thread)) {
    pr_info(MODULE_NAME": unable to start kernel thread\n");
    return -ENOMEM;
  }
  if((_gtpusp_sock.thread)) {
    wake_up_process(_gtpusp_sock.thread);
  }
  return xt_register_targets(gtpusp_tg_reg, ARRAY_SIZE(gtpusp_tg_reg));
close_and_out:
	sock_release(_gtpusp_sock.sock);
	_gtpusp_sock.sock = NULL;
	return err;
}
예제 #15
0
static int kern_release(struct inode *inode, struct file *filp)
{
	struct polldev *pd;
	PR_INFO("start");
	pd = (struct polldev *)(filp->private_data);
	kfree(pd);
	return 0;
}
예제 #16
0
/*
 * This is the open implementation
 */
static int kern_open(struct inode *inode, struct file *filp)
{
	struct polldev *pd;
	PR_INFO("start");
	pd = kmalloc(sizeof(struct polldev), GFP_KERNEL);
	if (IS_ERR(pd))
		return PTR_ERR(pd);
	init_waitqueue_head(&pd->wq);
	pd->state = 0;
	filp->private_data = pd;
	return 0;
}
예제 #17
0
/*
* This is the ioctl implementation.
*/
static long kern_unlocked_ioctl(struct file *fp, unsigned int cmd,
		unsigned long arg) {
	struct polldev *pd;
	pd = (struct polldev *)fp->private_data;
	PR_INFO("start %p", pd);
	switch (cmd) {
	case IOCTL_EPOLL_WAKE:
		PR_INFO("in WAKE");
		pd->state = POLLIN;
		wmb();
		wake_up_all(&pd->wq);
		return 0;
	case IOCTL_EPOLL_RESET:
		PR_INFO("in RESET");
		pd->state = 0;
		wmb();
		wake_up_all(&pd->wq);
		return 0;
	}
	return -ENOTTY;
}
예제 #18
0
static int
process_class_chaos(struct dns_query *query, uint8_t *buf)
{
    uint8_t        *p = buf;
    struct dnshdr  *resp;

    if (query->qtype != TYPE_TXT && query->qtype != TYPE_ANY) {
        PR_INFO("CHAOS type %d not implemented", query->qtype);
        return answer_notimpl(query, buf);
    }

    if ((query->len == sizeof(id_server) - 1
         && memcmp(query->name, id_server, query->len) == 0)
        || (query->len == sizeof(hostname_bind) - 1
            && memcmp(query->name, hostname_bind, query->len) == 0))
    {
        memcpy(p, query->packet, sizeof(struct dnshdr) + query->qlen + 2 + 2);
        p += sizeof(struct dnshdr) + query->qlen + 2 + 2;

        p += fill_rr_str(p, sizeof(struct dnshdr), TYPE_TXT, CLASS_CHAOS,
                         sysctl_knamed_default_ttl, 8, "flygoast");

        resp = (struct dnshdr *) buf;
        RESP_SET(resp, 1, RCODE_NOERROR);

        return p - buf;
    }

    if ((query->len == sizeof(version_server) - 1
         && memcmp(query->name, version_server, query->len) == 0)
        || (query->len == sizeof(version_bind) - 1
            && memcmp(query->name, version_bind, query->len) == 0))
    {
        if (sysctl_knamed_hide_version) {
            return answer_refused(query, buf);
        }

        memcpy(p, query->packet, sizeof(struct dnshdr) + query->qlen + 2 + 2);
        p += sizeof(struct dnshdr) + query->qlen + 2 + 2;

        p += fill_rr_str(p, sizeof(struct dnshdr), TYPE_TXT, CLASS_CHAOS,
                         sysctl_knamed_default_ttl,
                         strlen(KNAMED_TOKEN),
                         KNAMED_TOKEN);

        resp = (struct dnshdr *) buf;
        RESP_SET(resp, 1, RCODE_NOERROR);

        return p - buf;
    }

    return answer_notimpl(query, buf);
}
예제 #19
0
/*
* This is the ioctl implementation.
*/
static long kern_unlocked_ioctl(struct file *filp, unsigned int cmd,
		unsigned long arg)
{
	/* the buffer which will be used for the transaction */
	buffer b;
	int err;

	PR_DEBUG("start");
	switch (cmd) {
	case IOCTL_DIV_DOOPS:
		/* get the data from the user */
		err = copy_from_user(&b, (void *)arg, sizeof(b));
		if (err) {
			PR_ERROR("problem with copy_from_user");
			return err;
		}
		PR_DEBUG("after copy");
		PR_INFO("b.u1 is %llu", b.u1);
		PR_INFO("b.u2 is %llu", b.u2);
		PR_INFO("b.d1 is %lld", b.d1);
		PR_INFO("b.d2 is %lld", b.d2);
		b.udiv = b.u1 / b.u2;
		b.umul = b.u1 * b.u2;
		b.uadd = b.u1 + b.u2;
		b.usub = b.u1 - b.u2;
		b.ddiv = b.d1 / b.d2;
		b.dmul = b.d1 * b.d2;
		b.dadd = b.d1 + b.d2;
		b.dsub = b.d1 - b.d2;
		/* copy the data back to the user */
		err = copy_to_user((void *)arg, &b, sizeof(b));
		if (err) {
			PR_ERROR("problem with copy_to_user");
			return err;
		}
		/* everything is ok */
		return 0;
	}
	return -EINVAL;
}
예제 #20
0
파일: adu.c 프로젝트: open-power/pdbg
static int adu_lock(struct target *target)
{
	uint64_t val;

	CHECK_ERR(read_target(target, ALTD_CMD_REG, &val));

	if (val & FBC_LOCKED)
		PR_INFO("ADU already locked! Ignoring.\n");

	val |= FBC_LOCKED;
	CHECK_ERR(write_target(target, ALTD_CMD_REG, val));

	return 0;
}
예제 #21
0
/*
* This is the ioctl implementation.
*/
static long kern_unlocked_ioctl(struct file *filp, unsigned int cmd,
		unsigned long arg)
{
	PR_DEBUG("start");
	switch (cmd) {
	case IOCTL_RACE_EMPTY:
		/* empty ioctl to 'just work'; */
		/* PR_INFO("end"); */
		return 0;
	case IOCTL_RACE_SLEEP_SHORT:
		/* long ioctl to stall for time */
		msleep_interruptible(10000);
		PR_INFO("end");
		return 0;
	case IOCTL_RACE_SLEEP_LONG:
		/* long ioctl to stall for time */
		/* ssleep(10000); */
		msleep_interruptible(20000);
		PR_INFO("end");
		return 0;
	}
	PR_DEBUG("end");
	return -EINVAL;
}
예제 #22
0
/* our own functions */
static int __init mod_init(void)
{
	struct resource *rp;
	PR_INFO("start");
	rp = iomem_resource.child;
	while (rp) {
		pr_info("%0*llx-%0*llx\n",
			8, (unsigned long long)rp->start,
			8, (unsigned long long)rp->end
		);
		/* advance to the next resource... */
		rp = rp->sibling;
	}
	return 0;
}
예제 #23
0
파일: adu.c 프로젝트: open-power/pdbg
static int adu_unlock(struct target *target)
{
	uint64_t val;

	CHECK_ERR(read_target(target, ALTD_CMD_REG, &val));

	if (!(val & FBC_LOCKED)) {
		PR_INFO("ADU already unlocked!\n");
		return 0;
	}

	val &= ~FBC_LOCKED;
	CHECK_ERR(write_target(target, ALTD_CMD_REG, val));

	return 0;
}
//-----------------------------------------------------------------------------
static int _gtpusp_ksocket_send(struct socket *sock_pP, struct sockaddr_in *addr_pP, unsigned char *gtpuh_pP, int len_gtpP, unsigned char *buf_ip_pP, int len_ipP)
//-----------------------------------------------------------------------------
{
  struct msghdr msg;
  struct iovec  iov[2];
  mm_segment_t  oldfs;
  int           size = 0;
  int           err = 0;
  int           iov_index = 0;

  if ( (err = sock_pP->ops->connect(sock_pP, (struct sockaddr *)addr_pP, sizeof(struct sockaddr), 0)) < 0 ) {
	PR_INFO(MODULE_NAME": Could not connect to socket, error = %d\n", -err);
	return 0;
  }
  if (sock_pP->sk == NULL) {
	return 0;
  }
  if ((gtpuh_pP != NULL) && (len_gtpP > 0)) {
    iov[iov_index].iov_base       = gtpuh_pP;
    iov[iov_index].iov_len        = len_gtpP;
    iov_index += 1;
  }

  if ((buf_ip_pP != NULL) && (len_ipP > 0)) {
    iov[iov_index].iov_base       = buf_ip_pP;
    iov[iov_index].iov_len        = len_ipP;
    iov_index += 1;
  }

  msg.msg_flags      = 0;
  msg.msg_name       = addr_pP;
  msg.msg_namelen    = sizeof(struct sockaddr_in);
  msg.msg_control    = NULL;
  msg.msg_controllen = 0;
  msg.msg_iov        = iov;
  msg.msg_iovlen     = iov_index;
  msg.msg_control    = NULL;

  oldfs = get_fs();
  set_fs(KERNEL_DS);
  size = sock_sendmsg(sock_pP,&msg,len_ipP+len_gtpP);
  set_fs(oldfs);

  return size;
        }
예제 #25
0
static int __init knamed_init(void)
{
    struct file  *filp;
    int           ret;
    int           err;

    PR_INFO("starting");
    PR_INFO("Author: Gu Feng <*****@*****.**>");
    PR_INFO("Version: %s", KNAMED_VERSION);
    PR_INFO("Repository: https://github.com/flygoast/knamed.git");

    filp = filp_open(KNAMED_CONF, O_RDONLY, 0);
    if (IS_ERR(filp)) {
        PR_INFO("conf file \"%s\" didn't existed, ignored", KNAMED_CONF);
        goto init;
    }

    if (filp) {
        fput(filp);
    }

init:

    ret = nf_register_hooks(knamed_ops, ARRAY_SIZE(knamed_ops));
    if (ret < 0) {
        PR_ERR("can't register hooks.");
        goto cleanup;
    }

    knamed_memory_init();

    knamed_procfs_init();
    knamed_sysctl_register();


    dns_init();

    knamed_task = kthread_run(knamed_loop, NULL, "knamedtask");
    if (IS_ERR(knamed_task)) {
        PR_ERR("Create kernel thread failed");
        err = PTR_ERR(knamed_task);
        return err;
    }

    PR_INFO("started");

    return 0;

cleanup:

    return ret;
}
예제 #26
0
static void __exit knamed_exit(void)
{
    nf_unregister_hooks(knamed_ops, ARRAY_SIZE(knamed_ops));

    knamed_sysctl_unregister();
    knamed_procfs_release();

    dns_cleanup();

    if (knamed_task) {
        kthread_stop(knamed_task);
        wait_for_completion(&comp);
    }

    knamed_memory_release();

    PR_INFO("removed");
}
예제 #27
0
/* our own functions */
static int __init mod_init(void)
{
	PR_INFO("start");
	PR_INFO("name is %s", KBUILD_MODNAME);
	PR_INFO("name is %s", THIS_MODULE->name);
	PR_INFO("srcversion is %s", THIS_MODULE->srcversion);
	PR_INFO("version is %s", THIS_MODULE->version);
	/*
	PR_INFO("init_size is %d", THIS_MODULE->init_size);
	PR_INFO("core_size is %d", THIS_MODULE->core_size);
	PR_INFO("init_text_size is %d", THIS_MODULE->init_text_size);
	PR_INFO("core_text_size is %d", THIS_MODULE->core_text_size);
	*/
	PR_INFO("printk is %p", printk);
	/* using this symbol_get function you can also get kernel symbols,
	other modules symbols or your own exported symbols. */
	PR_INFO("printk (via get) is %p", symbol_get("printk"));
	return 0;
}
예제 #28
0
static int
knamed_port_sysctl(ctl_table *table, int write, void __user *buffer,
    size_t *lenp, loff_t *ppos)
{
    int  *valp = table->data;
    int   val = *valp;
    int   rc;

    rc = proc_dointvec(table, write, buffer, lenp, ppos);
    if (write && (*valp != val)) {
        if ((*valp < 0) || (*valp > 65535)) {
            PR_ERR("invalid port: %d, must be between 0-65535", *valp);
            /* Restore the correct value */
            *valp = val;
        } else {
            PR_INFO("change port from %d to %d", val, *valp);
        }
    }

    return rc;
}
예제 #29
0
static int
knamed_default_ttl_sysctl(ctl_table *table, int write, void __user *buffer,
    size_t *lenp, loff_t *ppos)
{
    int  *valp = table->data;
    int   val = *valp;
    int   rc;

    rc = proc_dointvec(table, write, buffer, lenp, ppos);
    if (write && (*valp != val)) {
        if (*valp < 0) {
            PR_ERR("Invalid ttl: %d, must be positive", *valp);
            /* Restore the correct value */
            *valp = val;
        } else {
            PR_INFO("Change ttl from %d to %d", val, *valp);
        }
    }

    return rc;
}
예제 #30
0
static void __exit mod_exit(void)
{
	PR_INFO("start");
	PR_INFO("end");
}