Lines Matching refs:ax25
38 static int ax25_rx_fragment(ax25_cb *ax25, struct sk_buff *skb) in ax25_rx_fragment() argument
42 if (ax25->fragno != 0) { in ax25_rx_fragment()
44 if ((ax25->fragno - 1) == (*skb->data & AX25_SEG_REM)) { in ax25_rx_fragment()
46 ax25->fragno = *skb->data & AX25_SEG_REM; in ax25_rx_fragment()
48 ax25->fraglen += skb->len; in ax25_rx_fragment()
49 skb_queue_tail(&ax25->frag_queue, skb); in ax25_rx_fragment()
52 if (ax25->fragno == 0) { in ax25_rx_fragment()
54 ax25->fraglen, in ax25_rx_fragment()
57 skb_queue_purge(&ax25->frag_queue); in ax25_rx_fragment()
63 skbn->dev = ax25->ax25_dev->dev; in ax25_rx_fragment()
68 while ((skbo = skb_dequeue(&ax25->frag_queue)) != NULL) { in ax25_rx_fragment()
75 ax25->fraglen = 0; in ax25_rx_fragment()
77 if (ax25_rx_iframe(ax25, skbn) == 0) in ax25_rx_fragment()
87 skb_queue_purge(&ax25->frag_queue); in ax25_rx_fragment()
88 ax25->fragno = *skb->data & AX25_SEG_REM; in ax25_rx_fragment()
90 ax25->fraglen = skb->len; in ax25_rx_fragment()
91 skb_queue_tail(&ax25->frag_queue, skb); in ax25_rx_fragment()
103 int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb) in ax25_rx_iframe() argument
111 ax25_start_idletimer(ax25); in ax25_rx_iframe()
129 skb->dev = ax25->ax25_dev->dev; in ax25_rx_iframe()
137 return ax25_rx_fragment(ax25, skb); in ax25_rx_iframe()
142 return (*func)(skb, ax25); in ax25_rx_iframe()
145 if (ax25->sk != NULL && ax25->ax25_dev->values[AX25_VALUES_CONMODE] == 2) { in ax25_rx_iframe()
146 if ((!ax25->pidincl && ax25->sk->sk_protocol == pid) || in ax25_rx_iframe()
147 ax25->pidincl) { in ax25_rx_iframe()
148 if (sock_queue_rcv_skb(ax25->sk, skb) == 0) in ax25_rx_iframe()
151 ax25->condition |= AX25_COND_OWN_RX_BUSY; in ax25_rx_iframe()
161 static int ax25_process_rx_frame(ax25_cb *ax25, struct sk_buff *skb, int type, int dama) in ax25_process_rx_frame() argument
165 if (ax25->state == AX25_STATE_0) in ax25_process_rx_frame()
168 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) { in ax25_process_rx_frame()
171 queued = ax25_std_frame_in(ax25, skb, type); in ax25_process_rx_frame()
176 if (dama || ax25->ax25_dev->dama.slave) in ax25_process_rx_frame()
177 queued = ax25_ds_frame_in(ax25, skb, type); in ax25_process_rx_frame()
179 queued = ax25_std_frame_in(ax25, skb, type); in ax25_process_rx_frame()
194 ax25_cb *ax25; in ax25_rcv() local
307 if ((ax25 = ax25_find_cb(&dest, &src, &reverse_dp, dev)) != NULL) { in ax25_rcv()
314 if (ax25_process_rx_frame(ax25, skb, type, dama) == 0) in ax25_rcv()
317 ax25_cb_put(ax25); in ax25_rcv()
357 ax25 = ax25_sk(make); in ax25_rcv()
369 if ((ax25 = ax25_create_cb()) == NULL) { in ax25_rcv()
374 ax25_fillin_cb(ax25, ax25_dev); in ax25_rcv()
377 ax25->source_addr = dest; in ax25_rcv()
378 ax25->dest_addr = src; in ax25_rcv()
383 if (dp.ndigi && !ax25->digipeat && in ax25_rcv()
384 (ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) { in ax25_rcv()
386 ax25_destroy_socket(ax25); in ax25_rcv()
393 kfree(ax25->digipeat); in ax25_rcv()
394 ax25->digipeat = NULL; in ax25_rcv()
397 memcpy(ax25->digipeat, &reverse_dp, sizeof(ax25_digi)); in ax25_rcv()
401 ax25->modulus = AX25_EMODULUS; in ax25_rcv()
402 ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW]; in ax25_rcv()
404 ax25->modulus = AX25_MODULUS; in ax25_rcv()
405 ax25->window = ax25_dev->values[AX25_VALUES_WINDOW]; in ax25_rcv()
408 ax25_send_control(ax25, AX25_UA, AX25_POLLON, AX25_RESPONSE); in ax25_rcv()
411 if (dama && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE) in ax25_rcv()
412 ax25_dama_on(ax25); in ax25_rcv()
415 ax25->state = AX25_STATE_3; in ax25_rcv()
417 ax25_cb_add(ax25); in ax25_rcv()
419 ax25_start_heartbeat(ax25); in ax25_rcv()
420 ax25_start_t3timer(ax25); in ax25_rcv()
421 ax25_start_idletimer(ax25); in ax25_rcv()