Lines Matching refs:ax25
20 #include <net/ax25.h>
35 ax25_cb *ax25;
51 if ((ax25 = ax25_find_cb(src, dest, digi, dev)) != NULL) {
52 ax25_output(ax25, paclen, skb);
53 return ax25; /* It already existed */
59 if ((ax25 = ax25_create_cb()) == NULL)
62 ax25_fillin_cb(ax25, ax25_dev);
64 ax25->source_addr = *src;
65 ax25->dest_addr = *dest;
68 ax25->digipeat = kmemdup(digi, sizeof(*digi), GFP_ATOMIC);
69 if (ax25->digipeat == NULL) {
70 ax25_cb_put(ax25);
75 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
78 ax25_std_establish_data_link(ax25);
84 ax25_ds_establish_data_link(ax25);
86 ax25_std_establish_data_link(ax25);
95 ax25_cb_hold(ax25);
97 ax25_cb_add(ax25);
99 ax25->state = AX25_STATE_1;
101 ax25_start_heartbeat(ax25);
103 ax25_output(ax25, paclen, skb);
105 return ax25; /* We had to create it */
116 void ax25_output(ax25_cb *ax25, int paclen, struct sk_buff *skb)
181 skb_queue_tail(&ax25->write_queue, skbn); /* Throw it on the queue */
186 skb_queue_tail(&ax25->write_queue, skb); /* Throw it on the queue */
189 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
192 ax25_kick(ax25);
201 if (!ax25->ax25_dev->dama.slave) ax25_kick(ax25);
211 static void ax25_send_iframe(ax25_cb *ax25, struct sk_buff *skb, int poll_bit)
220 if (ax25->modulus == AX25_MODULUS) {
225 *frame |= (ax25->vr << 5);
226 *frame |= (ax25->vs << 1);
231 frame[0] |= (ax25->vs << 1);
233 frame[1] |= (ax25->vr << 1);
236 ax25_start_idletimer(ax25);
238 ax25_transmit_buffer(ax25, skb, AX25_COMMAND);
241 void ax25_kick(ax25_cb *ax25)
247 if (ax25->state != AX25_STATE_3 && ax25->state != AX25_STATE_4)
250 if (ax25->condition & AX25_COND_PEER_RX_BUSY)
253 if (skb_peek(&ax25->write_queue) == NULL)
256 start = (skb_peek(&ax25->ack_queue) == NULL) ? ax25->va : ax25->vs;
257 end = (ax25->va + ax25->window) % ax25->modulus;
272 skb = skb_dequeue(&ax25->write_queue);
276 ax25->vs = start;
280 skb_queue_head(&ax25->write_queue, skb);
287 next = (ax25->vs + 1) % ax25->modulus;
295 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
298 ax25_send_iframe(ax25, skbn, (last) ? AX25_POLLON : AX25_POLLOFF);
303 ax25_send_iframe(ax25, skbn, AX25_POLLOFF);
308 ax25->vs = next;
313 skb_queue_tail(&ax25->ack_queue, skb);
315 } while (!last && (skb = skb_dequeue(&ax25->write_queue)) != NULL);
317 ax25->condition &= ~AX25_COND_ACK_PENDING;
319 if (!ax25_t1timer_running(ax25)) {
320 ax25_stop_t3timer(ax25);
321 ax25_calculate_t1(ax25);
322 ax25_start_t1timer(ax25);
326 void ax25_transmit_buffer(ax25_cb *ax25, struct sk_buff *skb, int type)
331 if (ax25->ax25_dev == NULL) {
332 ax25_disconnect(ax25, ENETUNREACH);
336 headroom = ax25_addr_size(ax25->digipeat);
348 ax25_addr_build(ptr, &ax25->source_addr, &ax25->dest_addr, ax25->digipeat, type, ax25->modulus);
350 ax25_queue_xmit(skb, ax25->ax25_dev->dev);
369 int ax25_check_iframes_acked(ax25_cb *ax25, unsigned short nr)
371 if (ax25->vs == nr) {
372 ax25_frames_acked(ax25, nr);
373 ax25_calculate_rtt(ax25);
374 ax25_stop_t1timer(ax25);
375 ax25_start_t3timer(ax25);
378 if (ax25->va != nr) {
379 ax25_frames_acked(ax25, nr);
380 ax25_calculate_t1(ax25);
381 ax25_start_t1timer(ax25);