Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 327986
b: refs/heads/master
c: 04d191c
h: refs/heads/master
v: v3
  • Loading branch information
Ben Hutchings authored and David S. Miller committed Sep 17, 2012
1 parent 7e0720e commit d350b0c
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 82 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 025e36332573177ecd7c12730e18a4390f994f05
refs/heads/master: 04d191c259e2a2832ea7aef14cb02fe03a71d51f
87 changes: 6 additions & 81 deletions trunk/net/llc/llc_station.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,9 @@
*
* @mac_sa: MAC source address
* @sap_list: list of related SAPs
* @ev_q: events entering state mach.
* @mac_pdu_q: PDUs ready to send to MAC
*/
struct llc_station {
struct {
struct sk_buff_head list;
spinlock_t lock;
} ev_q;
struct sk_buff_head mac_pdu_q;
};

Expand Down Expand Up @@ -215,79 +210,6 @@ static struct llc_station_state_trans *
return rc;
}

/**
* llc_station_free_ev - frees an event
* @skb: Address of the event
*
* Frees an event.
*/
static void llc_station_free_ev(struct sk_buff *skb)
{
kfree_skb(skb);
}

/**
* llc_station_next_state - processes event and goes to the next state
* @skb: Address of the event
*
* Processes an event, executes any transitions related to that event and
* updates the state of the station.
*/
static u16 llc_station_next_state(struct sk_buff *skb)
{
u16 rc = 1;
struct llc_station_state_trans *trans;

trans = llc_find_station_trans(skb);
if (trans)
/* got the state to which we next transition; perform the
* actions associated with this transition before actually
* transitioning to the next state
*/
rc = llc_exec_station_trans_actions(trans, skb);
else
/* event not recognized in current state; re-queue it for
* processing again at a later time; return failure
*/
rc = 0;
llc_station_free_ev(skb);
return rc;
}

/**
* llc_station_service_events - service events in the queue
*
* Get an event from the station event queue (if any); attempt to service
* the event; if event serviced, get the next event (if any) on the event
* queue; if event not service, re-queue the event on the event queue and
* attempt to service the next event; when serviced all events in queue,
* finished; if don't transition to different state, just service all
* events once; if transition to new state, service all events again.
* Caller must hold llc_main_station.ev_q.lock.
*/
static void llc_station_service_events(void)
{
struct sk_buff *skb;

while ((skb = skb_dequeue(&llc_main_station.ev_q.list)) != NULL)
llc_station_next_state(skb);
}

/**
* llc_station_state_process - queue event and try to process queue.
* @skb: Address of the event
*
* Queues an event (on the station event queue) for handling by the
* station state machine and attempts to process any queued-up events.
*/
static void llc_station_state_process(struct sk_buff *skb)
{
spin_lock_bh(&llc_main_station.ev_q.lock);
skb_queue_tail(&llc_main_station.ev_q.list, skb);
llc_station_service_events();
spin_unlock_bh(&llc_main_station.ev_q.lock);
}

/**
* llc_station_rcv - send received pdu to the station state machine
* @skb: received frame.
Expand All @@ -296,14 +218,17 @@ static void llc_station_state_process(struct sk_buff *skb)
*/
static void llc_station_rcv(struct sk_buff *skb)
{
llc_station_state_process(skb);
struct llc_station_state_trans *trans;

trans = llc_find_station_trans(skb);
if (trans)
llc_exec_station_trans_actions(trans, skb);
kfree_skb(skb);
}

void __init llc_station_init(void)
{
skb_queue_head_init(&llc_main_station.mac_pdu_q);
skb_queue_head_init(&llc_main_station.ev_q.list);
spin_lock_init(&llc_main_station.ev_q.lock);
llc_set_station_handler(llc_station_rcv);
}

Expand Down

0 comments on commit d350b0c

Please sign in to comment.