Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 368485
b: refs/heads/master
c: 26fd76c
h: refs/heads/master
i:
  368483: 0b1ffa8
v: v3
  • Loading branch information
Samuel Ortiz committed Mar 10, 2013
1 parent ba5961f commit 5f426b5
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e4306bec47fc02178c612879c848d3a6544424dd
refs/heads/master: 26fd76cab2e61cedc5c25f7151fb31b57ddc53c7
1 change: 1 addition & 0 deletions trunk/include/linux/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@ struct ucred {
#define SOL_IUCV 277
#define SOL_CAIF 278
#define SOL_ALG 279
#define SOL_NFC 280

/* IPX options */
#define IPX_TYPE 1
Expand Down
4 changes: 4 additions & 0 deletions trunk/include/uapi/linux/nfc.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,4 +220,8 @@ struct sockaddr_nfc_llcp {
#define NFC_LLCP_DIRECTION_RX 0x00
#define NFC_LLCP_DIRECTION_TX 0x01

/* socket option names */
#define NFC_LLCP_RW 0
#define NFC_LLCP_MIUX 1

#endif /*__LINUX_NFC_H */
3 changes: 3 additions & 0 deletions trunk/net/nfc/llcp/llcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ struct nfc_llcp_sock {
u8 dsap;
char *service_name;
size_t service_name_len;
u8 rw;
u16 miux;


/* Remote link parameters */
u8 remote_rw;
Expand Down
119 changes: 117 additions & 2 deletions trunk/net/nfc/llcp/sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,121 @@ static int llcp_sock_listen(struct socket *sock, int backlog)
return ret;
}

static int nfc_llcp_setsockopt(struct socket *sock, int level, int optname,
char __user *optval, unsigned int optlen)
{
struct sock *sk = sock->sk;
struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
u32 opt;
int err = 0;

pr_debug("%p optname %d\n", sk, optname);

if (level != SOL_NFC)
return -ENOPROTOOPT;

lock_sock(sk);

switch (optname) {
case NFC_LLCP_RW:
if (sk->sk_state == LLCP_CONNECTED ||
sk->sk_state == LLCP_BOUND ||
sk->sk_state == LLCP_LISTEN) {
err = -EINVAL;
break;
}

if (get_user(opt, (u32 __user *) optval)) {
err = -EFAULT;
break;
}

if (opt > LLCP_MAX_RW) {
err = -EINVAL;
break;
}

llcp_sock->rw = (u8) opt;

break;

case NFC_LLCP_MIUX:
if (sk->sk_state == LLCP_CONNECTED ||
sk->sk_state == LLCP_BOUND ||
sk->sk_state == LLCP_LISTEN) {
err = -EINVAL;
break;
}

if (get_user(opt, (u32 __user *) optval)) {
err = -EFAULT;
break;
}

if (opt > LLCP_MAX_MIUX) {
err = -EINVAL;
break;
}

llcp_sock->miux = (u16) opt;

break;

default:
err = -ENOPROTOOPT;
break;
}

release_sock(sk);

return err;
}

static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname,
char __user *optval, int __user *optlen)
{
struct sock *sk = sock->sk;
struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
int len, err = 0;

pr_debug("%p optname %d\n", sk, optname);

if (level != SOL_NFC)
return -ENOPROTOOPT;

if (get_user(len, optlen))
return -EFAULT;

len = min_t(u32, len, sizeof(u32));

lock_sock(sk);

switch (optname) {
case NFC_LLCP_RW:
if (put_user(llcp_sock->rw, (u32 __user *) optval))
err = -EFAULT;

break;

case NFC_LLCP_MIUX:
if (put_user(llcp_sock->miux, (u32 __user *) optval))
err = -EFAULT;

break;

default:
err = -ENOPROTOOPT;
break;
}

release_sock(sk);

if (put_user(len, optlen))
return -EFAULT;

return err;
}

void nfc_llcp_accept_unlink(struct sock *sk)
{
struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
Expand Down Expand Up @@ -735,8 +850,8 @@ static const struct proto_ops llcp_sock_ops = {
.ioctl = sock_no_ioctl,
.listen = llcp_sock_listen,
.shutdown = sock_no_shutdown,
.setsockopt = sock_no_setsockopt,
.getsockopt = sock_no_getsockopt,
.setsockopt = nfc_llcp_setsockopt,
.getsockopt = nfc_llcp_getsockopt,
.sendmsg = llcp_sock_sendmsg,
.recvmsg = llcp_sock_recvmsg,
.mmap = sock_no_mmap,
Expand Down

0 comments on commit 5f426b5

Please sign in to comment.