kernel network
Ferner Cilloniz
fernercc at gmail.com
Wed Dec 31 06:06:56 UTC 2008
Thanks! That solved it.
On Tue, 2008-12-30 at 23:03 -0600, Gerry Weaver wrote:
>
> ______________________________________________________________
> From: Ferner Cilloniz [mailto:fernercc at gmail.com]
> To: freebsd-net at freebsd.org
> Sent: Tue, 30 Dec 2008 15:36:07 -0600
> Subject: Re: kernel network
>
> I tried another approach. The code is below. However,
> wireshark does not
> pick up anything happening. I don't know what is going on.
>
> static int my_udp_send(struct thread *td, void *syscall_args)
> {
> struct socket *sock = NULL;
>
> if( socreate(AF_INET, &sock, SOCK_DGRAM, 0,
> td->td_proc->p_ucred,
> td) != 0 ) {
> uprintf("socreate() returned error\n");
> return -1;
> }
>
> struct sockaddr_in sin;
> sin.sin_len = sizeof(struct sockaddr_in);
> sin.sin_family = AF_INET;
> sin.sin_port = htons(8080);
> inet_aton("192.168.2.2", &sin.sin_addr);
>
> struct mbuf *top = m_getclr(M_TRYWAIT, MT_CONTROL);
>
> // IP is 0
> int sosend_error = sosend(sock, (struct sockaddr *)&sin, NULL,
> top,
> NULL, 0, td);
> uprintf("sosend(): %d\n", sosend_error);
>
> soclose(sock);
>
> return 0;
> }
>
>
>
>
> On Tue, 2008-12-30 at 17:16 +0000, Ferner Cilloniz wrote:
> > I have been tackling this today. This is what i have so far:
> >
> >
> -------------------------------------------------------------------------
> > static int my_udp_send(struct thread *td, void
> *syscall_args)
> > {
> > struct socket *sock = NULL;
> >
> > if( socreate(AF_INET, &sock, SOCK_DGRAM, 0,
> td->td_proc->p_ucred,
> > td) != 0 ) {
> > uprintf("socreate() returned error\n");
> > return -1;
> > }
> >
> > struct sockaddr sa;
> > sa.sa_len = sizeof(struct sockaddr_in);
> >
> > struct sockaddr_in *sin = (struct sockaddr_in *)&sa;
> > sin->sin_family = AF_INET;
> > inet_aton("192.168.2.2", (struct sockaddr_in
> *)&sin->sin_addr);
> > sin->sin_port = htons(8080);
> > sin->sin_len = sizeof(*sin);
> > memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
> >
> > // int soconnect_error = soconnect(sock, (struct sockaddr
> *)sin, td);
> > // uprintf("soconnect(): %d\n", soconnect_error);
> >
> > struct mbuf *top = m_getclr(M_TRYWAIT, MT_CONTROL);
> >
> > // IP is 0
> > int sosend_error = sosend(sock, (struct sockaddr *)sin,
> NULL, top,
> > NULL, 0, td);
> > uprintf("sosend(): %d\n", sosend_error);
> >
> > soclose(sock);
> >
> > return 0;
> > }
> >
> -------------------------------------------------------------------------
> >
> >
> > However, when listening to my home network using wireshark,
> I filter out
> > everything but UDP packets with the 192.168.2.2 address on
> them. I'm
> > afraid to say that there aren't any packets showing.
> >
> > Am i doing something wrong? Note, that I am not filling in
> the mbuf and
> > all the wacking casting done.
> >
> > Thanks.
> >
> > On Tue, 2008-12-30 at 18:46 +0000, Robert Watson wrote:
> > > On Tue, 30 Dec 2008, Max Laier wrote:
> > >
> > > > On Tuesday 30 December 2008 12:49:55 Ferner Cilloniz
> wrote:
> > > >
> > > >> I do not think I could ever be more tired of this topic
> but I cannot seem
> > > >> to understand what to do. I have tried more about a
> month now to send
> > > >> arbitrary UDP packets from a kernel module but cannot
> achieve it. I have
> > > >> looked at udp_send but found that building a socket*
> was much to tedious.
> > > >> Later i looked at in-kernel webservers
> (http://openketa.sourceforge.net/)
> > > >> but could not find anything useful.
> > > >>
> > > >> Netgraph is a possibility, but there isn't any
> documentation on accessing
> > > >> the network from kernel space.
> > > >>
> > > >> What do you all suggest?
> > > >
> > > > $ man 9 socket
> > >
> > > Definitely the preferred solution, if it meets the
> application model. Call
> > > socreate(9) to allocate the socket, sobind(9) if required,
> calls to sosend(9)
> > > to generate packets, and soclose(9) when done. Direct
> calls to the
> > > udp_output() and udp_send() functions won't work without a
> socket context, and
> > > doing sosend(9) will isolate in-kernel consumers from
> future changes in UDP
> > > internals. ip_output() could be invoked directly to
> generate IP packets, but
> > > won't allow you to easily receive replies, etc.
> > >
> > > Robert N M Watson
> > > Computer Laboratory
> > > University of Cambridge
> --
> Cilloniz Bicchi, Ferner
>
> Research Assistant
> Dept. of Computer Sciences
> The University of Texas at Austin
> http://www.cs.utexas.edu/~fernercc
> fernercc at cs.utexas.edu
>
> _______________________________________________
> freebsd-net at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to
> "freebsd-net-unsubscribe at freebsd.org"
> Hello Ferner,
>
> I believe you need a packet header in your mbuf. Try m_gethdr instead
> of
> m_getclr.
>
> Thanks,
> Gerry
--
Cilloniz Bicchi, Ferner
Research Assistant
Dept. of Computer Sciences
The University of Texas at Austin
http://www.cs.utexas.edu/~fernercc
fernercc at cs.utexas.edu
More information about the freebsd-net
mailing list