public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Guram Z. Savinov" <savinov.guram@gmail.com>
To: linux-kernel@vger.kernel.org
Subject: Re: Get interface MAC address in sys_accept4() syscall
Date: Fri, 30 Jul 2010 03:51:36 +0400	[thread overview]
Message-ID: <4C521408.3040506@gmail.com> (raw)
In-Reply-To: <4C5211D6.3000406@gmail.com>

30.07.2010 03:42, Guram Z. Savinov пишет:
> Hi all,
>
> in net/socket.c is syscall sys_accept4(). In it syscall I need to get 
> MAC address of interface, from connection is come.
> For example it is two interfaces eth0 and eth1. I want to know, from 
> what interface connection is come to sys_accept4().
> Please help me, how I can do it.
>
> Thank's for attention for my question.
I forget tell: kernel version: 2.6.28
Here is code of sys_accept4() syscall, in it I need get MAC address of 
interface:

/*
  *    For accept, we attempt to create a new socket, set up the link
  *    with the client, wake up the client, then return the new
  *    connected fd. We collect the address of the connector in kernel
  *    space and move it to user at the very end. This is unclean because
  *    we open the socket then return an error.
  *
  *    1003.1g adds the ability to recvmsg() to query connection pending
  *    status to recvmsg. We need to add that support in a way thats
  *    clean when we restucture accept also.
  */

asmlinkage long sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
                 int __user *upeer_addrlen, int flags)
{
     struct socket *sock, *newsock;
     struct file *newfile;
     int err, len, newfd, fput_needed;
     struct sockaddr_storage address;

     if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
         return -EINVAL;

     if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
         flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;

     sock = sockfd_lookup_light(fd, &err, &fput_needed);
     if (!sock)
         goto out;

     err = -ENFILE;
     if (!(newsock = sock_alloc()))
         goto out_put;

     newsock->type = sock->type;
     newsock->ops = sock->ops;

     /*
      * We don't need try_module_get here, as the listening socket (sock)
      * has the protocol module (sock->ops->owner) held.
      */
     __module_get(newsock->ops->owner);

     newfd = sock_alloc_fd(&newfile, flags & O_CLOEXEC);
     if (unlikely(newfd < 0)) {
         err = newfd;
         sock_release(newsock);
         goto out_put;
     }

     err = sock_attach_fd(newsock, newfile, flags & O_NONBLOCK);
     if (err < 0)
         goto out_fd_simple;

     err = security_socket_accept(sock, newsock);
     if (err)
         goto out_fd;

     err = sock->ops->accept(sock, newsock, sock->file->f_flags);
     if (err < 0)
         goto out_fd;

     if (upeer_sockaddr) {
         if (newsock->ops->getname(newsock, (struct sockaddr *)&address,
&len, 2) < 0) {
             err = -ECONNABORTED;
             goto out_fd;
         }
         err = move_addr_to_user((struct sockaddr *)&address,
                     len, upeer_sockaddr, upeer_addrlen);
         if (err < 0)
             goto out_fd;
     }

     /* File flags are not inherited via accept() unlike another OSes. */

     fd_install(newfd, newfile);
     err = newfd;

     security_socket_post_accept(sock, newsock);

out_put:
     fput_light(sock->file, fput_needed);
out:
     return err;
out_fd_simple:
     sock_release(newsock);
     put_filp(newfile);
     put_unused_fd(newfd);
     goto out_put;
out_fd:
     fput(newfile);
     put_unused_fd(newfd);
     goto out_put;
}

  reply	other threads:[~2010-07-29 23:51 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-29 23:42 Get interface MAC address in sys_accept4() syscall Guram Z. Savinov
2010-07-29 23:51 ` Guram Z. Savinov [this message]
2010-07-30  7:17 ` Américo Wang
     [not found]   ` <AANLkTi=bSLALO0xP3kWgX9ipRBroDsqzXp6=kPuwMtW2@mail.gmail.com>
2010-07-30 10:03     ` Américo Wang
2010-07-30 10:22       ` Guram Z. Savinov
2010-07-30 16:15         ` Miquel van Smoorenburg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4C521408.3040506@gmail.com \
    --to=savinov.guram@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox