Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

llc: add support for LLC_OPT_PKTINFO

Signed-off-by: Octavian Purdila <opurdila@ixiacom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Octavian Purdila and committed by
David S. Miller
e5cd6fe3 bf9ae538

+37
+7
include/linux/llc.h
··· 36 36 LLC_OPT_BUSY_TMR_EXP, /* busy state expire time (secs). */ 37 37 LLC_OPT_TX_WIN, /* tx window size. */ 38 38 LLC_OPT_RX_WIN, /* rx window size. */ 39 + LLC_OPT_PKTINFO, /* ancillary packet information. */ 39 40 LLC_OPT_MAX 40 41 }; 41 42 ··· 70 69 #define LLC_SAP_LAR 0xDC /* LAN Address Resolution */ 71 70 #define LLC_SAP_RM 0xD4 /* Resource Management */ 72 71 #define LLC_SAP_GLOBAL 0xFF /* Global SAP. */ 72 + 73 + struct llc_pktinfo { 74 + int lpi_ifindex; 75 + unsigned char lpi_sap; 76 + unsigned char lpi_mac[IFHWADDRLEN]; 77 + }; 73 78 74 79 #ifdef __KERNEL__ 75 80 #define LLC_SAP_DYN_START 0xC0
+1
include/net/llc_conn.h
··· 76 76 u32 rx_pdu_hdr; /* used for saving header of last pdu 77 77 received and caused sending FRMR. 78 78 Used for resending FRMR */ 79 + u32 cmsg_flags; 79 80 }; 80 81 81 82 static inline struct llc_sock *llc_sk(const struct sock *sk)
+29
net/llc/af_llc.c
··· 47 47 #define dprintk(args...) 48 48 #endif 49 49 50 + /* Maybe we'll add some more in the future. */ 51 + #define LLC_CMSG_PKTINFO 1 52 + 53 + 50 54 /** 51 55 * llc_ui_next_link_no - return the next unused link number for a sap 52 56 * @sap: Address of sap to get link number from. ··· 595 591 return rc; 596 592 } 597 593 594 + static void llc_cmsg_rcv(struct msghdr *msg, struct sk_buff *skb) 595 + { 596 + struct llc_sock *llc = llc_sk(skb->sk); 597 + 598 + if (llc->cmsg_flags & LLC_CMSG_PKTINFO) { 599 + struct llc_pktinfo info; 600 + 601 + info.lpi_ifindex = llc_sk(skb->sk)->dev->ifindex; 602 + llc_pdu_decode_dsap(skb, &info.lpi_sap); 603 + llc_pdu_decode_da(skb, info.lpi_mac); 604 + put_cmsg(msg, SOL_LLC, LLC_OPT_PKTINFO, sizeof(info), &info); 605 + } 606 + } 607 + 598 608 /** 599 609 * llc_ui_accept - accept a new incoming connection. 600 610 * @sock: Socket which connections arrive on. ··· 830 812 memcpy(uaddr, llc_ui_skb_cb(skb), sizeof(*uaddr)); 831 813 msg->msg_namelen = sizeof(*uaddr); 832 814 } 815 + if (llc_sk(sk)->cmsg_flags) 816 + llc_cmsg_rcv(msg, skb); 833 817 goto out; 834 818 } 835 819 ··· 1050 1030 goto out; 1051 1031 llc->rw = opt; 1052 1032 break; 1033 + case LLC_OPT_PKTINFO: 1034 + if (opt) 1035 + llc->cmsg_flags |= LLC_CMSG_PKTINFO; 1036 + else 1037 + llc->cmsg_flags &= ~LLC_CMSG_PKTINFO; 1038 + break; 1053 1039 default: 1054 1040 rc = -ENOPROTOOPT; 1055 1041 goto out; ··· 1109 1083 val = llc->k; break; 1110 1084 case LLC_OPT_RX_WIN: 1111 1085 val = llc->rw; break; 1086 + case LLC_OPT_PKTINFO: 1087 + val = (llc->cmsg_flags & LLC_CMSG_PKTINFO) != 0; 1088 + break; 1112 1089 default: 1113 1090 rc = -ENOPROTOOPT; 1114 1091 goto out;