···7676 u32 rx_pdu_hdr; /* used for saving header of last pdu7777 received and caused sending FRMR.7878 Used for resending FRMR */7979+ u32 cmsg_flags;7980};80818182static inline struct llc_sock *llc_sk(const struct sock *sk)
+29
net/llc/af_llc.c
···4747#define dprintk(args...)4848#endif49495050+/* Maybe we'll add some more in the future. */5151+#define LLC_CMSG_PKTINFO 15252+5353+5054/**5155 * llc_ui_next_link_no - return the next unused link number for a sap5256 * @sap: Address of sap to get link number from.···595591 return rc;596592}597593594594+static void llc_cmsg_rcv(struct msghdr *msg, struct sk_buff *skb)595595+{596596+ struct llc_sock *llc = llc_sk(skb->sk);597597+598598+ if (llc->cmsg_flags & LLC_CMSG_PKTINFO) {599599+ struct llc_pktinfo info;600600+601601+ info.lpi_ifindex = llc_sk(skb->sk)->dev->ifindex;602602+ llc_pdu_decode_dsap(skb, &info.lpi_sap);603603+ llc_pdu_decode_da(skb, info.lpi_mac);604604+ put_cmsg(msg, SOL_LLC, LLC_OPT_PKTINFO, sizeof(info), &info);605605+ }606606+}607607+598608/**599609 * llc_ui_accept - accept a new incoming connection.600610 * @sock: Socket which connections arrive on.···830812 memcpy(uaddr, llc_ui_skb_cb(skb), sizeof(*uaddr));831813 msg->msg_namelen = sizeof(*uaddr);832814 }815815+ if (llc_sk(sk)->cmsg_flags)816816+ llc_cmsg_rcv(msg, skb);833817 goto out;834818}835819···10501030 goto out;10511031 llc->rw = opt;10521032 break;10331033+ case LLC_OPT_PKTINFO:10341034+ if (opt)10351035+ llc->cmsg_flags |= LLC_CMSG_PKTINFO;10361036+ else10371037+ llc->cmsg_flags &= ~LLC_CMSG_PKTINFO;10381038+ break;10531039 default:10541040 rc = -ENOPROTOOPT;10551041 goto out;···11091083 val = llc->k; break;11101084 case LLC_OPT_RX_WIN:11111085 val = llc->rw; break;10861086+ case LLC_OPT_PKTINFO:10871087+ val = (llc->cmsg_flags & LLC_CMSG_PKTINFO) != 0;10881088+ break;11121089 default:11131090 rc = -ENOPROTOOPT;11141091 goto out;