Lines Matching refs:ax25

26 #include <net/ax25.h>
63 static void ax25_cb_del(ax25_cb *ax25)
66 if (!hlist_unhashed(&ax25->ax25_node)) {
67 hlist_del_init(&ax25->ax25_node);
68 ax25_cb_put(ax25);
160 void ax25_cb_add(ax25_cb *ax25)
163 ax25_cb_hold(ax25);
164 hlist_add_head(&ax25->ax25_node, &ax25_list);
290 ax25_cb *ax25 = from_timer(ax25, t, dtimer);
293 sk=ax25->sk;
297 ax25_destroy_socket(ax25);
308 void ax25_destroy_socket(ax25_cb *ax25)
312 ax25_cb_del(ax25);
314 ax25_stop_heartbeat(ax25);
315 ax25_stop_t1timer(ax25);
316 ax25_stop_t2timer(ax25);
317 ax25_stop_t3timer(ax25);
318 ax25_stop_idletimer(ax25);
320 ax25_clear_queues(ax25); /* Flush the queues */
322 if (ax25->sk != NULL) {
323 while ((skb = skb_dequeue(&ax25->sk->sk_receive_queue)) != NULL) {
324 if (skb->sk != ax25->sk) {
340 skb_queue_purge(&ax25->sk->sk_write_queue);
343 if (ax25->sk != NULL) {
344 if (sk_has_allocations(ax25->sk)) {
346 timer_setup(&ax25->dtimer, ax25_destroy_timer, 0);
347 ax25->dtimer.expires = jiffies + 2 * HZ;
348 add_timer(&ax25->dtimer);
350 struct sock *sk=ax25->sk;
351 ax25->sk=NULL;
355 ax25_cb_put(ax25);
369 ax25_cb *ax25;
390 ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev);
391 if (!ax25) {
398 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
400 if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
401 ax25_dama_off(ax25);
403 ax25_disconnect(ax25, ENETRESET);
407 if (ax25->modulus == AX25_MODULUS) {
414 ax25->window = ax25_ctl.arg;
420 ax25->rtt = (ax25_ctl.arg * HZ) / 2;
421 ax25->t1 = ax25_ctl.arg * HZ;
427 ax25->t2 = ax25_ctl.arg * HZ;
433 ax25->n2count = 0;
434 ax25->n2 = ax25_ctl.arg;
440 ax25->t3 = ax25_ctl.arg * HZ;
447 ax25->idle = ax25_ctl.arg * 60 * HZ;
453 ax25->paclen = ax25_ctl.arg;
462 ax25_cb_put(ax25);
470 static void ax25_fillin_cb_from_dev(ax25_cb *ax25, ax25_dev *ax25_dev)
472 ax25->rtt = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]) / 2;
473 ax25->t1 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]);
474 ax25->t2 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T2]);
475 ax25->t3 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T3]);
476 ax25->n2 = ax25_dev->values[AX25_VALUES_N2];
477 ax25->paclen = ax25_dev->values[AX25_VALUES_PACLEN];
478 ax25->idle = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_IDLE]);
479 ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
482 ax25->modulus = AX25_EMODULUS;
483 ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW];
485 ax25->modulus = AX25_MODULUS;
486 ax25->window = ax25_dev->values[AX25_VALUES_WINDOW];
494 void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
496 ax25->ax25_dev = ax25_dev;
498 if (ax25->ax25_dev != NULL) {
499 ax25_fillin_cb_from_dev(ax25, ax25_dev);
506 ax25->rtt = msecs_to_jiffies(AX25_DEF_T1) / 2;
507 ax25->t1 = msecs_to_jiffies(AX25_DEF_T1);
508 ax25->t2 = msecs_to_jiffies(AX25_DEF_T2);
509 ax25->t3 = msecs_to_jiffies(AX25_DEF_T3);
510 ax25->n2 = AX25_DEF_N2;
511 ax25->paclen = AX25_DEF_PACLEN;
512 ax25->idle = msecs_to_jiffies(AX25_DEF_IDLE);
513 ax25->backoff = AX25_DEF_BACKOFF;
516 ax25->modulus = AX25_EMODULUS;
517 ax25->window = AX25_DEF_EWINDOW;
519 ax25->modulus = AX25_MODULUS;
520 ax25->window = AX25_DEF_WINDOW;
529 ax25_cb *ax25;
531 if ((ax25 = kzalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
534 refcount_set(&ax25->refcount, 1);
536 skb_queue_head_init(&ax25->write_queue);
537 skb_queue_head_init(&ax25->frag_queue);
538 skb_queue_head_init(&ax25->ack_queue);
539 skb_queue_head_init(&ax25->reseq_queue);
541 ax25_setup_timers(ax25);
543 ax25_fillin_cb(ax25, NULL);
545 ax25->state = AX25_STATE_0;
547 return ax25;
559 ax25_cb *ax25;
575 ax25 = sk_to_ax25(sk);
579 if (ax25->modulus == AX25_MODULUS) {
590 ax25->window = opt;
598 ax25->rtt = (opt * HZ) >> 1;
599 ax25->t1 = opt * HZ;
607 ax25->t2 = opt * HZ;
615 ax25->n2 = opt;
623 ax25->t3 = opt * HZ;
631 ax25->idle = opt * 60 * HZ;
639 ax25->backoff = opt;
643 ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
647 ax25->pidincl = opt ? 1 : 0;
651 ax25->iamdigi = opt ? 1 : 0;
659 ax25->paclen = opt;
688 ax25->ax25_dev = ax25_dev_ax25dev(dev);
689 if (!ax25->ax25_dev) {
694 ax25_fillin_cb(ax25, ax25->ax25_dev);
710 ax25_cb *ax25;
730 ax25 = sk_to_ax25(sk);
734 val = ax25->window;
738 val = ax25->t1 / HZ;
742 val = ax25->t2 / HZ;
746 val = ax25->n2;
750 val = ax25->t3 / HZ;
754 val = ax25->idle / (60 * HZ);
758 val = ax25->backoff;
762 val = (ax25->modulus == AX25_EMODULUS);
766 val = ax25->pidincl;
770 val = ax25->iamdigi;
774 val = ax25->paclen;
778 ax25_dev = ax25->ax25_dev;
836 ax25_cb *ax25;
897 ax25 = ax25_sk(sk)->cb = ax25_create_cb();
898 if (!ax25) {
909 ax25->sk = sk;
917 ax25_cb *ax25, *oax25;
923 if ((ax25 = ax25_create_cb()) == NULL) {
935 ax25_cb_put(ax25);
951 ax25->modulus = oax25->modulus;
952 ax25->backoff = oax25->backoff;
953 ax25->pidincl = oax25->pidincl;
954 ax25->iamdigi = oax25->iamdigi;
955 ax25->rtt = oax25->rtt;
956 ax25->t1 = oax25->t1;
957 ax25->t2 = oax25->t2;
958 ax25->t3 = oax25->t3;
959 ax25->n2 = oax25->n2;
960 ax25->idle = oax25->idle;
961 ax25->paclen = oax25->paclen;
962 ax25->window = oax25->window;
964 ax25->ax25_dev = ax25_dev;
965 ax25->source_addr = oax25->source_addr;
968 ax25->digipeat = kmemdup(oax25->digipeat, sizeof(ax25_digi),
970 if (ax25->digipeat == NULL) {
972 ax25_cb_put(ax25);
977 ax25_sk(sk)->cb = ax25;
979 ax25->sk = sk;
987 ax25_cb *ax25;
996 ax25 = sk_to_ax25(sk);
997 ax25_dev = ax25->ax25_dev;
1000 switch (ax25->state) {
1002 if (!sock_flag(ax25->sk, SOCK_DEAD)) {
1004 ax25_disconnect(ax25, 0);
1007 ax25_destroy_socket(ax25);
1012 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
1014 ax25_disconnect(ax25, 0);
1016 if (!sock_flag(ax25->sk, SOCK_DESTROY))
1017 ax25_destroy_socket(ax25);
1022 ax25_clear_queues(ax25);
1023 ax25->n2count = 0;
1025 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1028 ax25_send_control(ax25,
1032 ax25_stop_t2timer(ax25);
1033 ax25_stop_t3timer(ax25);
1034 ax25_stop_idletimer(ax25);
1038 ax25_stop_t3timer(ax25);
1039 ax25_stop_idletimer(ax25);
1043 ax25_calculate_t1(ax25);
1044 ax25_start_t1timer(ax25);
1045 ax25->state = AX25_STATE_2;
1059 ax25_destroy_socket(ax25);
1063 del_timer_sync(&ax25->timer);
1064 del_timer_sync(&ax25->t1timer);
1065 del_timer_sync(&ax25->t2timer);
1066 del_timer_sync(&ax25->t3timer);
1067 del_timer_sync(&ax25->idletimer);
1069 netdev_put(ax25_dev->dev, &ax25->dev_tracker);
1093 ax25_cb *ax25;
1121 ax25 = sk_to_ax25(sk);
1127 ax25->source_addr = call;
1132 if (ax25->ax25_dev != NULL)
1149 ax25_fillin_cb(ax25, ax25_dev);
1150 netdev_hold(ax25_dev->dev, &ax25->dev_tracker, GFP_ATOMIC);
1154 ax25_cb_add(ax25);
1170 ax25_cb *ax25 = sk_to_ax25(sk), *ax25t;
1224 kfree(ax25->digipeat);
1225 ax25->digipeat = NULL;
1251 AX25_HBIT) && ax25->iamdigi) {
1271 if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) {
1276 ax25_fillin_cb(ax25, ax25->ax25_dev);
1277 ax25_cb_add(ax25);
1279 if (ax25->ax25_dev == NULL) {
1287 (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
1288 ax25->ax25_dev->dev))) {
1295 ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1296 ax25->digipeat = digi;
1309 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1312 ax25_std_establish_data_link(ax25);
1317 ax25->modulus = AX25_MODULUS;
1318 ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
1319 if (ax25->ax25_dev->dama.slave)
1320 ax25_ds_establish_data_link(ax25);
1322 ax25_std_establish_data_link(ax25);
1327 ax25->state = AX25_STATE_1;
1329 ax25_start_heartbeat(ax25);
1450 ax25_cb *ax25;
1455 ax25 = sk_to_ax25(sk);
1464 fsa->fsa_ax25.sax25_call = ax25->dest_addr;
1466 if (ax25->digipeat != NULL) {
1467 ndigi = ax25->digipeat->ndigi;
1471 ax25->digipeat->calls[i];
1475 fsa->fsa_ax25.sax25_call = ax25->source_addr;
1477 if (ax25->ax25_dev != NULL) {
1479 ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
1499 ax25_cb *ax25;
1507 ax25 = sk_to_ax25(sk);
1520 if (ax25->ax25_dev == NULL) {
1525 if (len > ax25->ax25_dev->dev->mtu) {
1577 ax25cmp(&ax25->dest_addr, &sax.sax25_call)) {
1596 sax.sax25_call = ax25->dest_addr;
1597 dp = ax25->digipeat;
1602 size = len + ax25->ax25_dev->dev->hard_header_len;
1620 if (!ax25->pidincl)
1632 ax25_output(ax25, ax25->paclen, skb);
1643 lv = ax25_addr_build(skb->data, &ax25->source_addr, &sax.sax25_call,
1651 ax25_queue_xmit(skb, ax25->ax25_dev->dev);
1840 ax25_cb *ax25 = sk_to_ax25(sk);
1843 ax25_info.t1 = ax25->t1 / HZ;
1844 ax25_info.t2 = ax25->t2 / HZ;
1845 ax25_info.t3 = ax25->t3 / HZ;
1846 ax25_info.idle = ax25->idle / (60 * HZ);
1847 ax25_info.n2 = ax25->n2;
1848 ax25_info.t1timer = ax25_display_timer(&ax25->t1timer) / HZ;
1849 ax25_info.t2timer = ax25_display_timer(&ax25->t2timer) / HZ;
1850 ax25_info.t3timer = ax25_display_timer(&ax25->t3timer) / HZ;
1851 ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ);
1852 ax25_info.n2count = ax25->n2count;
1853 ax25_info.state = ax25->state;
1856 ax25_info.vs = ax25->vs;
1857 ax25_info.vr = ax25->vr;
1858 ax25_info.va = ax25->va;
1859 ax25_info.vs_max = ax25->vs; /* reserved */
1860 ax25_info.paclen = ax25->paclen;
1861 ax25_info.window = ax25->window;
1945 ax25_cb *ax25 = hlist_entry(v, struct ax25_cb, ax25_node);
1956 ax25,
1957 ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
1958 ax2asc(buf, &ax25->source_addr),
1959 ax25->iamdigi? "*":"");
1960 seq_printf(seq, "%s", ax2asc(buf, &ax25->dest_addr));
1962 for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1964 ax2asc(buf, &ax25->digipeat->calls[k]),
1965 ax25->digipeat->repeated[k]? "*":"");
1969 ax25->state,
1970 ax25->vs, ax25->vr, ax25->va,
1971 ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
1972 ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
1973 ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
1974 ax25_display_timer(&ax25->idletimer) / (60 * HZ),
1975 ax25->idle / (60 * HZ),
1976 ax25->n2count, ax25->n2,
1977 ax25->rtt / HZ,
1978 ax25->window,
1979 ax25->paclen);
1981 if (ax25->sk != NULL) {
1983 sk_wmem_alloc_get(ax25->sk),
1984 sk_rmem_alloc_get(ax25->sk),
1985 sock_i_ino(ax25->sk));
2051 proc_create_seq("ax25", 0444, init_net.proc_net, &ax25_info_seqops);
2068 remove_proc_entry("ax25", init_net.proc_net);