All of lore.kernel.org
 help / color / mirror / Atom feed
* compiling libipq example
@ 2005-02-25  8:36 Essien Ita Essien
  2005-03-03 12:54 ` Patrick McHardy
  2005-03-03 13:17 ` Jonas Berlin
  0 siblings, 2 replies; 5+ messages in thread
From: Essien Ita Essien @ 2005-02-25  8:36 UTC (permalink / raw)
  To: netfilter-devel

[-- Attachment #1: Type: text/plain, Size: 1800 bytes --]

Hi,

I'm trying to follow the tutorial in the libipq man page, with just a 
little modification, and i get a compile error when i try to access the 
ipq_packet_msg_t structure. I've checked where ipq_packet_msg_t is 
defined, and found it in <linux/netfilter_ipv4/ip_queue.h>, which i've 
found is conditionally included in <libipq.h> already. I even tried 
including straight into the program.

Any ideas what i'm doing wrong?

thanks.

The error i get is:

first.c: In function `main':
first.c:47: error: dereferencing pointer to incomplete type
first.c:51: error: dereferencing pointer to incomplete type



The program is:

#include <stdio.h>
#include <linux/netfilter.h>
#include <libipq.h>
#include <linux/ip.h>
#include <linux/tcp.h>



#define BUFSIZE 2048

static void die(struct ipq_handle *h)
{
	ipq_perror("passer");
	ipq_destroy_handle(h);
	exit(1);
}


int main(int argc, char **argv)
{
	int status;
	unsigned char buf[BUFSIZE];


	struct ipq_handle *h;
	h = ipq_create_handle(0,PF_INET);
	if (!h)
		die(h);


	status = ipq_set_mode(h,IPQ_COPY_PACKET,BUFSIZE);
	if (status < 0)
		die(h);

	while (1) {
		status = ipq_read(h,buf,BUFSIZE,0);
		if (status < 0)
			die(h);

		switch(ipq_message_type(buf)) {
			case NLMSG_ERROR:
				fprintf(stderr,"Recieved Error Message: %d\n",ipq_get_msgerr(buf));
				break;

			case IPQM_PACKET: {
				struct ipq_packet_msg_t *m = ipq_get_packet(buf);
				struct iphdr *ip = (struct iphdr*) m->payload; /*this line give the 
error*/
				fprintf(stdout,"Saddr: %d\nDaddr: %d\n",ip->saddr,ip->daddr);

				
				status = ipq_set_verdict(h,m->packet_id,NF_ACCEPT,0,NULL); /*this 
line also borks*/
				if (status < 0)
					die(h);

				break;

				}

			default:
				fprintf(stderr,"Unknown Message Type!\n");
		}

	}

	ipq_destroy_handle(h);
	return 0;
}

[-- Attachment #2: first.c --]
[-- Type: text/plain, Size: 1177 bytes --]

#include <stdio.h>
#include <linux/netfilter.h>
#include <libipq.h>
#include <linux/ip.h>
#include <linux/tcp.h>



#define BUFSIZE 2048

static void die(struct ipq_handle *h)
{
	ipq_perror("passer");
	ipq_destroy_handle(h);
	exit(1);
}


int main(int argc, char **argv)
{
	int status;
	unsigned char buf[BUFSIZE];


	struct ipq_handle *h;
	h = ipq_create_handle(0,PF_INET);
	if (!h)
		die(h);


	status = ipq_set_mode(h,IPQ_COPY_PACKET,BUFSIZE);
	if (status < 0)
		die(h);

	while (1) {
		status = ipq_read(h,buf,BUFSIZE,0);
		if (status < 0)
			die(h);

		switch(ipq_message_type(buf)) {
			case NLMSG_ERROR:
				fprintf(stderr,"Recieved Error Message: %d\n",ipq_get_msgerr(buf));
				break;

			case IPQM_PACKET: {
				struct ipq_packet_msg_t *m = ipq_get_packet(buf);
				struct iphdr *ip = (struct iphdr*) m->payload; /*this line give the error*/
				fprintf(stdout,"Saddr: %d\nDaddr: %d\n",ip->saddr,ip->daddr);

				
				status = ipq_set_verdict(h,m->packet_id,NF_ACCEPT,0,NULL); /*this line also borks*/
				if (status < 0)
					die(h);

				break;

				}

			default:
				fprintf(stderr,"Unknown Message Type!\n");
		}

	}

	ipq_destroy_handle(h);
	return 0;
}








^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: compiling libipq example
  2005-02-25  8:36 compiling libipq example Essien Ita Essien
@ 2005-03-03 12:54 ` Patrick McHardy
  2005-03-03 15:28   ` Essien Ita Essien
  2005-03-03 13:17 ` Jonas Berlin
  1 sibling, 1 reply; 5+ messages in thread
From: Patrick McHardy @ 2005-03-03 12:54 UTC (permalink / raw)
  To: Essien Ita Essien; +Cc: netfilter-devel

[-- Attachment #1: Type: text/plain, Size: 545 bytes --]

Essien Ita Essien wrote:
> Hi,
> 
> I'm trying to follow the tutorial in the libipq man page, with just a 
> little modification, and i get a compile error when i try to access the 
> ipq_packet_msg_t structure. I've checked where ipq_packet_msg_t is 
> defined, and found it in <linux/netfilter_ipv4/ip_queue.h>, which i've 
> found is conditionally included in <libipq.h> already. I even tried 
> including straight into the program.
> 
> Any ideas what i'm doing wrong?

I've used the attached code for testing some time ago, maybe it helps.

[-- Attachment #2: Makefile --]
[-- Type: text/plain, Size: 158 bytes --]

CC	= gcc
LD	= ld
CFLAGS	= -Wall -O2
LDFLAGS	= -lipq

all: nfqtest

clean:
	rm -f nfqtest nfqtest.o

nfqtest: nfqtest.o
	$(CC) nfqtest.o -o nfqtest $(LDFLAGS)

[-- Attachment #3: nfqtest.c --]
[-- Type: text/x-csrc, Size: 1771 bytes --]

/* just some testing code for the netfilter packet queuing to userspace
   (C) 2000 by Harald Welte <laforge@sunbeam.franken.de>

   This code is licensed under GPL conditions
*/
#include <stdio.h>
#include <stdlib.h>
#include <libipq/libipq.h>
#include <linux/netfilter.h>
#include <sys/socket.h>
#include <sys/un.h>

#define IPQ_BUF_SIZE 100000

static struct ipq_handle *qh;

static int handle_packet(ipq_packet_msg_t *pkt)
{
	int ret;

	printf("id: %lu, mark: %lu, timestamp: %ld %ld , indev: %s, datalen: %u\n",
	       pkt->packet_id, pkt->mark, pkt->timestamp_sec, pkt->timestamp_usec,
	       pkt->indev_name, (unsigned int)pkt->data_len);

	ret = ipq_set_verdict(qh, pkt->packet_id, NF_ACCEPT, pkt->data_len, pkt->payload);
	if (ret < 0) {
		printf("error setting verdict\n");
		ipq_perror(NULL);
	}
	return ret;
}

int main(int argc, char **argv)
{
	ssize_t len;
	unsigned char *buf;

	qh = ipq_create_handle(0, PF_INET);
	if (!qh) {
		printf("can't create netlink socket\n");
		ipq_perror(NULL);
		exit(1);
	}
	if (ipq_set_mode(qh, IPQ_COPY_PACKET, 0xFFFF) < 0) {
		printf("can't set netlink mode\n");
		ipq_perror(NULL);
		exit(2);
	}

	buf = malloc(IPQ_BUF_SIZE);
	while (1) {
		int ptype, error;
		ipq_packet_msg_t *packet;

		len = ipq_read(qh, buf, IPQ_BUF_SIZE, 0);
		if (len < 0) {
			printf("len < 0\n");
			break;
		} else if (len == 0) {
			printf("timeout exceeded\n");
			continue;
		}
		ptype = ipq_message_type(buf);
		packet = ipq_get_packet(buf);
		printf("received packet, length=%d, type=%d\n", (int)len, ptype);

		switch (ptype) {
		case NLMSG_ERROR:
			error = -ipq_get_msgerr(buf);
			printf("NLMSG_ERROR: %d\n", error);
			exit(3);
			break;

		case IPQM_PACKET:
			handle_packet(packet);
			break;
		}
	}
	ipq_perror(NULL);
	exit(0);
}

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: compiling libipq example
  2005-02-25  8:36 compiling libipq example Essien Ita Essien
  2005-03-03 12:54 ` Patrick McHardy
@ 2005-03-03 13:17 ` Jonas Berlin
  2005-03-03 15:26   ` Essien Ita Essien
  1 sibling, 1 reply; 5+ messages in thread
From: Jonas Berlin @ 2005-03-03 13:17 UTC (permalink / raw)
  To: Essien Ita Essien; +Cc: netfilter-devel

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Essien Ita Essien wrote:

| Any ideas what i'm doing wrong?

Found it! :)

| first.c:47: error: dereferencing pointer to incomplete type

The error is on line 46:

|                 struct ipq_packet_msg_t *m = ipq_get_packet(buf);

it should be either

struct ipq_packet_msg *m

or

ipq_packet_msg_t *m

but not

struct ipq_packet_msg_t *m

:)

- --
- - xkr47
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)

iD8DBQFCJw5lxyF48ZTvn+4RAppkAKC+vJ6OOMUWvYwibvBLbo1xWIfj+QCgjk+l
Chu0AEhgZHffTyUNtC2JlDo=
=WRhi
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: compiling libipq example
  2005-03-03 13:17 ` Jonas Berlin
@ 2005-03-03 15:26   ` Essien Ita Essien
  0 siblings, 0 replies; 5+ messages in thread
From: Essien Ita Essien @ 2005-03-03 15:26 UTC (permalink / raw)
  To: 'Jonas Berlin', 'Essien Ita Essien'; +Cc: netfilter-devel


>The error is on line 46:

>|                 struct ipq_packet_msg_t *m = ipq_get_packet(buf);

>it should be either

>struct ipq_packet_msg *m

>or

>ipq_packet_msg_t *m

>but not

>struct ipq_packet_msg_t *m

>:)

HOLY CROWBARS!!! 

My bad thnx a million... 

funny thing is EVEN after looking thru the header file... I DIDN'T notice
that typedef error.

Thnx again.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: compiling libipq example
  2005-03-03 12:54 ` Patrick McHardy
@ 2005-03-03 15:28   ` Essien Ita Essien
  0 siblings, 0 replies; 5+ messages in thread
From: Essien Ita Essien @ 2005-03-03 15:28 UTC (permalink / raw)
  To: 'Patrick McHardy'; +Cc: netfilter-devel


> I've used the attached code for testing some time ago, maybe it helps.

Thnx Patrick. It gonna help more now that I know what I did wrong :)

Quite grateful

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2005-03-03 15:28 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-02-25  8:36 compiling libipq example Essien Ita Essien
2005-03-03 12:54 ` Patrick McHardy
2005-03-03 15:28   ` Essien Ita Essien
2005-03-03 13:17 ` Jonas Berlin
2005-03-03 15:26   ` Essien Ita Essien

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.