From 99cc2b9193c1bce9085201379a642dda14e4f7e3 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Thu, 3 Aug 2006 16:38:49 -0700 Subject: [PATCH] --- yaml --- r: 33216 b: refs/heads/master c: 30a584d944fbd599d4a8f470f75bf7af1a15b466 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/llc/af_llc.c | 20 ++++++++------------ trunk/net/llc/llc_sap.c | 4 ++-- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index b0ba162b16d3..3c6e85a5eac4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b9e2cc0f0e47ad351349156018ef8a365e9c6d25 +refs/heads/master: 30a584d944fbd599d4a8f470f75bf7af1a15b466 diff --git a/trunk/net/llc/af_llc.c b/trunk/net/llc/af_llc.c index d6cfe84d521b..2652ead96c64 100644 --- a/trunk/net/llc/af_llc.c +++ b/trunk/net/llc/af_llc.c @@ -784,24 +784,20 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, copied += used; len -= used; - if (used + offset < skb->len) - continue; - if (!(flags & MSG_PEEK)) { sk_eat_skb(sk, skb, 0); *seq = 0; } + + /* For non stream protcols we get one packet per recvmsg call */ + if (sk->sk_type != SOCK_STREAM) + goto copy_uaddr; + + /* Partial read */ + if (used + offset < skb->len) + continue; } while (len > 0); - /* - * According to UNIX98, msg_name/msg_namelen are ignored - * on connected socket. -ANK - * But... af_llc still doesn't have separate sets of methods for - * SOCK_DGRAM and SOCK_STREAM :-( So we have to do this test, will - * eventually fix this tho :-) -acme - */ - if (sk->sk_type == SOCK_DGRAM) - goto copy_uaddr; out: release_sock(sk); return copied; diff --git a/trunk/net/llc/llc_sap.c b/trunk/net/llc/llc_sap.c index 20c4eb5c1ac6..42eb0c3a9780 100644 --- a/trunk/net/llc/llc_sap.c +++ b/trunk/net/llc/llc_sap.c @@ -51,10 +51,10 @@ void llc_save_primitive(struct sock *sk, struct sk_buff* skb, u8 prim) { struct sockaddr_llc *addr; - if (skb->sk->sk_type == SOCK_STREAM) /* See UNIX98 */ - return; /* save primitive for use by the user. */ addr = llc_ui_skb_cb(skb); + + memset(addr, 0, sizeof(*addr)); addr->sllc_family = sk->sk_family; addr->sllc_arphrd = skb->dev->type; addr->sllc_test = prim == LLC_TEST_PRIM;