[LLC] split llc_pdu_router into llc_{station,sap,conn}_rcv

parent c3be6700
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#define LLC_MAC_H #define LLC_MAC_H
/* /*
* Copyright (c) 1997 by Procom Technology, Inc. * Copyright (c) 1997 by Procom Technology, Inc.
* 2001 by Arnaldo Carvalho de Melo <acme@conectiva.com.br> * 2001, 2002 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
* *
* This program can be redistributed or modified under the terms of the * This program can be redistributed or modified under the terms of the
* GNU General Public License as published by the Free Software Foundation. * GNU General Public License as published by the Free Software Foundation.
...@@ -17,9 +17,8 @@ extern int llc_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -17,9 +17,8 @@ extern int llc_rcv(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt); struct packet_type *pt);
extern struct net_device *mac_dev_peer(struct net_device *current_dev, extern struct net_device *mac_dev_peer(struct net_device *current_dev,
int type, u8 *mac); int type, u8 *mac);
extern int llc_pdu_router(struct llc_sap *sap, struct sock *sk,
struct sk_buff *skb, u8 type);
extern u16 lan_hdrs_init(struct sk_buff *skb, u8 *sa, u8 *da); extern u16 lan_hdrs_init(struct sk_buff *skb, u8 *sa, u8 *da);
extern int llc_conn_rcv(struct sock *sk, struct sk_buff *skb);
static __inline__ void llc_set_backlog_type(struct sk_buff *skb, char type) static __inline__ void llc_set_backlog_type(struct sk_buff *skb, char type)
{ {
......
...@@ -33,8 +33,9 @@ ...@@ -33,8 +33,9 @@
#define dprintk(args...) #define dprintk(args...)
#endif #endif
/* function prototypes */
static void fix_up_incoming_skb(struct sk_buff *skb); static void fix_up_incoming_skb(struct sk_buff *skb);
static void llc_station_rcv(struct sk_buff *skb);
static void llc_sap_rcv(struct llc_sap *sap, struct sk_buff *skb);
/** /**
* mac_send_pdu - Sends PDU to specific device. * mac_send_pdu - Sends PDU to specific device.
...@@ -74,9 +75,9 @@ int mac_send_pdu(struct sk_buff *skb) ...@@ -74,9 +75,9 @@ int mac_send_pdu(struct sk_buff *skb)
* *
* When the system receives a 802.2 frame this function is called. It * When the system receives a 802.2 frame this function is called. It
* checks SAP and connection of received pdu and passes frame to * checks SAP and connection of received pdu and passes frame to
* llc_pdu_router for sending to proper state machine. If frame is * llc_{station,sap,conn}_rcv for sending to proper state machine. If
* related to a busy connection (a connection is sending data now), * the frame is related to a busy connection (a connection is sending
* function queues this frame in connection's backlog. * data now), it queues this frame in the connection's backlog.
*/ */
int llc_rcv(struct sk_buff *skb, struct net_device *dev, int llc_rcv(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt) struct packet_type *pt)
...@@ -85,7 +86,8 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -85,7 +86,8 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev,
struct llc_pdu_sn *pdu; struct llc_pdu_sn *pdu;
u8 dest; u8 dest;
/* When the interface is in promisc. mode, drop all the crap that it /*
* When the interface is in promisc. mode, drop all the crap that it
* receives, do not try to analyse it. * receives, do not try to analyse it.
*/ */
if (skb->pkt_type == PACKET_OTHERHOST) { if (skb->pkt_type == PACKET_OTHERHOST) {
...@@ -98,18 +100,16 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -98,18 +100,16 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev,
fix_up_incoming_skb(skb); fix_up_incoming_skb(skb);
pdu = llc_pdu_sn_hdr(skb); pdu = llc_pdu_sn_hdr(skb);
if (!pdu->dsap) { /* NULL DSAP, refer to station */ if (!pdu->dsap) { /* NULL DSAP, refer to station */
if (llc_pdu_router(NULL, NULL, skb, 0)) llc_station_rcv(skb);
goto drop;
goto out; goto out;
} }
sap = llc_sap_find(pdu->dsap); sap = llc_sap_find(pdu->dsap);
if (!sap) /* unknown SAP */ if (!sap) /* unknown SAP */
goto drop; goto drop;
llc_decode_pdu_type(skb, &dest); llc_decode_pdu_type(skb, &dest);
if (dest == LLC_DEST_SAP) { /* type 1 services */ if (dest == LLC_DEST_SAP) /* type 1 services */
if (llc_pdu_router(sap, NULL, skb, LLC_TYPE_1)) llc_sap_rcv(sap, skb);
goto drop; else if (dest == LLC_DEST_CONN) {
} else if (dest == LLC_DEST_CONN) {
struct llc_addr saddr, daddr; struct llc_addr saddr, daddr;
struct sock *sk; struct sock *sk;
int rc; int rc;
...@@ -136,10 +136,8 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -136,10 +136,8 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev,
skb->sk = sk; skb->sk = sk;
bh_lock_sock(sk); bh_lock_sock(sk);
if (!sk->lock.users) if (!sk->lock.users)
rc = llc_pdu_router(llc_sk(sk)->sap, sk, skb, rc = llc_conn_rcv(sk, skb);
LLC_TYPE_2);
else { else {
dprintk("%s: add to backlog\n", __FUNCTION__);
llc_set_backlog_type(skb, LLC_PACKET); llc_set_backlog_type(skb, LLC_PACKET);
sk_add_backlog(sk, skb); sk_add_backlog(sk, skb);
rc = 0; rc = 0;
...@@ -184,53 +182,56 @@ static void fix_up_incoming_skb(struct sk_buff *skb) ...@@ -184,53 +182,56 @@ static void fix_up_incoming_skb(struct sk_buff *skb)
} }
} }
/** /*
* llc_pdu_router - routes received pdus to the upper layers * llc_station_rcv - send received pdu to the station state machine
* @sap: current sap component structure. * @skb: received frame.
* @sk: current connection structure.
* @frame: received frame.
* @type: type of received frame, that is LLC_TYPE_1 or LLC_TYPE_2
* *
* Queues received PDUs from LLC_MAC PDU receive queue until queue is * Sends data unit to station state machine.
* empty; examines LLC header to determine the destination of PDU, if DSAP
* is NULL then data unit destined for station else frame destined for SAP
* or connection; finds a matching open SAP, if one, forwards the packet
* to it; if no matching SAP, drops the packet. Returns 0 or the return of
* llc_conn_state_process (that may well result in the connection being
* destroyed)
*/ */
int llc_pdu_router(struct llc_sap *sap, struct sock* sk, static void llc_station_rcv(struct sk_buff *skb)
struct sk_buff *skb, u8 type)
{ {
struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); struct llc_station *station = llc_station_get();
int rc = 0; struct llc_station_state_ev *ev = llc_station_ev(skb);
ev->type = LLC_STATION_EV_TYPE_PDU;
ev->data.pdu.reason = 0;
llc_station_state_process(station, skb);
}
if (!pdu->dsap) {
struct llc_station *station = llc_station_get();
struct llc_station_state_ev *ev = llc_station_ev(skb);
ev->type = LLC_STATION_EV_TYPE_PDU; /**
ev->data.pdu.reason = 0; * llc_conn_rcv - sends received pdus to the connection state machine
llc_station_state_process(station, skb); * @sk: current connection structure.
} else if (type == LLC_TYPE_1) { * @skb: received frame.
struct llc_sap_state_ev *ev = llc_sap_ev(skb); *
* Sends received pdus to the connection state machine.
*/
int llc_conn_rcv(struct sock* sk, struct sk_buff *skb)
{
struct llc_conn_state_ev *ev = llc_conn_ev(skb);
struct llc_opt *llc = llc_sk(sk);
ev->type = LLC_SAP_EV_TYPE_PDU; if (!llc->dev)
ev->data.pdu.reason = 0; llc->dev = skb->dev;
llc_sap_state_process(sap, skb); ev->type = LLC_CONN_EV_TYPE_PDU;
} else if (type == LLC_TYPE_2) { ev->data.pdu.reason = 0;
struct llc_conn_state_ev *ev = llc_conn_ev(skb); return llc_conn_state_process(sk, skb);
struct llc_opt *llc = llc_sk(sk); }
if (!llc->dev) /**
llc->dev = skb->dev; * llc_sap_rcv - sends received pdus to the sap state machine
* @sap: current sap component structure.
* @skb: received frame.
*
* Sends received pdus to the sap state machine.
*/
static void llc_sap_rcv(struct llc_sap *sap, struct sk_buff *skb)
{
struct llc_sap_state_ev *ev = llc_sap_ev(skb);
ev->type = LLC_CONN_EV_TYPE_PDU; ev->type = LLC_SAP_EV_TYPE_PDU;
ev->data.pdu.reason = 0; ev->data.pdu.reason = 0;
rc = llc_conn_state_process(sk, skb); llc_sap_state_process(sap, skb);
} else
rc = -EINVAL;
return rc;
} }
/** /**
......
...@@ -146,7 +146,7 @@ static int llc_backlog_rcv(struct sock *sk, struct sk_buff *skb) ...@@ -146,7 +146,7 @@ static int llc_backlog_rcv(struct sock *sk, struct sk_buff *skb)
if (llc_backlog_type(skb) == LLC_PACKET) { if (llc_backlog_type(skb) == LLC_PACKET) {
if (llc->state > 1) /* not closed */ if (llc->state > 1) /* not closed */
rc = llc_pdu_router(llc->sap, sk, skb, LLC_TYPE_2); rc = llc_conn_rcv(sk, skb);
else else
kfree_skb(skb); kfree_skb(skb);
} else if (llc_backlog_type(skb) == LLC_EVENT) { } else if (llc_backlog_type(skb) == LLC_EVENT) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment