llc_s_ac.c (6072B)
1/* 2 * llc_s_ac.c - actions performed during sap state transition. 3 * 4 * Description : 5 * Functions in this module are implementation of sap component actions. 6 * Details of actions can be found in IEEE-802.2 standard document. 7 * All functions have one sap and one event as input argument. All of 8 * them return 0 On success and 1 otherwise. 9 * 10 * Copyright (c) 1997 by Procom Technology, Inc. 11 * 2001-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br> 12 * 13 * This program can be redistributed or modified under the terms of the 14 * GNU General Public License as published by the Free Software Foundation. 15 * This program is distributed without any warranty or implied warranty 16 * of merchantability or fitness for a particular purpose. 17 * 18 * See the GNU General Public License for more details. 19 */ 20 21#include <linux/netdevice.h> 22#include <net/llc.h> 23#include <net/llc_pdu.h> 24#include <net/llc_s_ac.h> 25#include <net/llc_s_ev.h> 26#include <net/llc_sap.h> 27 28 29/** 30 * llc_sap_action_unitdata_ind - forward UI PDU to network layer 31 * @sap: SAP 32 * @skb: the event to forward 33 * 34 * Received a UI PDU from MAC layer; forward to network layer as a 35 * UNITDATA INDICATION; verify our event is the kind we expect 36 */ 37int llc_sap_action_unitdata_ind(struct llc_sap *sap, struct sk_buff *skb) 38{ 39 llc_sap_rtn_pdu(sap, skb); 40 return 0; 41} 42 43/** 44 * llc_sap_action_send_ui - sends UI PDU resp to UNITDATA REQ to MAC layer 45 * @sap: SAP 46 * @skb: the event to send 47 * 48 * Sends a UI PDU to the MAC layer in response to a UNITDATA REQUEST 49 * primitive from the network layer. Verifies event is a primitive type of 50 * event. Verify the primitive is a UNITDATA REQUEST. 51 */ 52int llc_sap_action_send_ui(struct llc_sap *sap, struct sk_buff *skb) 53{ 54 struct llc_sap_state_ev *ev = llc_sap_ev(skb); 55 int rc; 56 57 llc_pdu_header_init(skb, LLC_PDU_TYPE_U, ev->saddr.lsap, 58 ev->daddr.lsap, LLC_PDU_CMD); 59 llc_pdu_init_as_ui_cmd(skb); 60 rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac); 61 if (likely(!rc)) { 62 skb_get(skb); 63 rc = dev_queue_xmit(skb); 64 } 65 return rc; 66} 67 68/** 69 * llc_sap_action_send_xid_c - send XID PDU as response to XID REQ 70 * @sap: SAP 71 * @skb: the event to send 72 * 73 * Send a XID command PDU to MAC layer in response to a XID REQUEST 74 * primitive from the network layer. Verify event is a primitive type 75 * event. Verify the primitive is a XID REQUEST. 76 */ 77int llc_sap_action_send_xid_c(struct llc_sap *sap, struct sk_buff *skb) 78{ 79 struct llc_sap_state_ev *ev = llc_sap_ev(skb); 80 int rc; 81 82 llc_pdu_header_init(skb, LLC_PDU_TYPE_U_XID, ev->saddr.lsap, 83 ev->daddr.lsap, LLC_PDU_CMD); 84 llc_pdu_init_as_xid_cmd(skb, LLC_XID_NULL_CLASS_2, 0); 85 rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac); 86 if (likely(!rc)) { 87 skb_get(skb); 88 rc = dev_queue_xmit(skb); 89 } 90 return rc; 91} 92 93/** 94 * llc_sap_action_send_xid_r - send XID PDU resp to MAC for received XID 95 * @sap: SAP 96 * @skb: the event to send 97 * 98 * Send XID response PDU to MAC in response to an earlier received XID 99 * command PDU. Verify event is a PDU type event 100 */ 101int llc_sap_action_send_xid_r(struct llc_sap *sap, struct sk_buff *skb) 102{ 103 u8 mac_da[ETH_ALEN], mac_sa[ETH_ALEN], dsap; 104 int rc = 1; 105 struct sk_buff *nskb; 106 107 llc_pdu_decode_sa(skb, mac_da); 108 llc_pdu_decode_da(skb, mac_sa); 109 llc_pdu_decode_ssap(skb, &dsap); 110 nskb = llc_alloc_frame(NULL, skb->dev, LLC_PDU_TYPE_U, 111 sizeof(struct llc_xid_info)); 112 if (!nskb) 113 goto out; 114 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, 115 LLC_PDU_RSP); 116 llc_pdu_init_as_xid_rsp(nskb, LLC_XID_NULL_CLASS_2, 0); 117 rc = llc_mac_hdr_init(nskb, mac_sa, mac_da); 118 if (likely(!rc)) 119 rc = dev_queue_xmit(nskb); 120out: 121 return rc; 122} 123 124/** 125 * llc_sap_action_send_test_c - send TEST PDU to MAC in resp to TEST REQ 126 * @sap: SAP 127 * @skb: the event to send 128 * 129 * Send a TEST command PDU to the MAC layer in response to a TEST REQUEST 130 * primitive from the network layer. Verify event is a primitive type 131 * event; verify the primitive is a TEST REQUEST. 132 */ 133int llc_sap_action_send_test_c(struct llc_sap *sap, struct sk_buff *skb) 134{ 135 struct llc_sap_state_ev *ev = llc_sap_ev(skb); 136 int rc; 137 138 llc_pdu_header_init(skb, LLC_PDU_TYPE_U, ev->saddr.lsap, 139 ev->daddr.lsap, LLC_PDU_CMD); 140 llc_pdu_init_as_test_cmd(skb); 141 rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac); 142 if (likely(!rc)) { 143 skb_get(skb); 144 rc = dev_queue_xmit(skb); 145 } 146 return rc; 147} 148 149int llc_sap_action_send_test_r(struct llc_sap *sap, struct sk_buff *skb) 150{ 151 u8 mac_da[ETH_ALEN], mac_sa[ETH_ALEN], dsap; 152 struct sk_buff *nskb; 153 int rc = 1; 154 u32 data_size; 155 156 llc_pdu_decode_sa(skb, mac_da); 157 llc_pdu_decode_da(skb, mac_sa); 158 llc_pdu_decode_ssap(skb, &dsap); 159 160 /* The test request command is type U (llc_len = 3) */ 161 data_size = ntohs(eth_hdr(skb)->h_proto) - 3; 162 nskb = llc_alloc_frame(NULL, skb->dev, LLC_PDU_TYPE_U, data_size); 163 if (!nskb) 164 goto out; 165 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, 166 LLC_PDU_RSP); 167 llc_pdu_init_as_test_rsp(nskb, skb); 168 rc = llc_mac_hdr_init(nskb, mac_sa, mac_da); 169 if (likely(!rc)) 170 rc = dev_queue_xmit(nskb); 171out: 172 return rc; 173} 174 175/** 176 * llc_sap_action_report_status - report data link status to layer mgmt 177 * @sap: SAP 178 * @skb: the event to send 179 * 180 * Report data link status to layer management. Verify our event is the 181 * kind we expect. 182 */ 183int llc_sap_action_report_status(struct llc_sap *sap, struct sk_buff *skb) 184{ 185 return 0; 186} 187 188/** 189 * llc_sap_action_xid_ind - send XID PDU resp to net layer via XID IND 190 * @sap: SAP 191 * @skb: the event to send 192 * 193 * Send a XID response PDU to the network layer via a XID INDICATION 194 * primitive. 195 */ 196int llc_sap_action_xid_ind(struct llc_sap *sap, struct sk_buff *skb) 197{ 198 llc_sap_rtn_pdu(sap, skb); 199 return 0; 200} 201 202/** 203 * llc_sap_action_test_ind - send TEST PDU to net layer via TEST IND 204 * @sap: SAP 205 * @skb: the event to send 206 * 207 * Send a TEST response PDU to the network layer via a TEST INDICATION 208 * primitive. Verify our event is a PDU type event. 209 */ 210int llc_sap_action_test_ind(struct llc_sap *sap, struct sk_buff *skb) 211{ 212 llc_sap_rtn_pdu(sap, skb); 213 return 0; 214}