+/*
+ * Complete all pending X.25 call requests --- this gets called after
+ * the X.25 link has been restarted.
+ */
+#define RESHUFFLELCN(maxlcn, lcn) ((maxlcn) - (lcn) + 1)
+
+pk_callcomplete(pkp)
+ register struct pkcb *pkp;
+{
+ register struct pklcd *lcp;
+ register int i;
+ register int ni;
+
+
+ if (pkp -> pk_dxerole & DTE_CONNECTPENDING)
+ pkp -> pk_dxerole &= ~DTE_CONNECTPENDING;
+ else return;
+
+ if (pkp -> pk_chan == 0)
+ return;
+
+ /*
+ * We pretended to be a DTE for allocating lcns, if
+ * it turns out that we are in reality performing as a
+ * DCE we need to reshuffle the lcps.
+ *
+ * /+---------------+-------- -
+ * / | a (maxlcn-1) | \
+ * / +---------------+ \
+ * +--- * | b (maxlcn-2) | \
+ * | \ +---------------+ \
+ * r | \ | c (maxlcn-3) | \
+ * e | \+---------------+ |
+ * s | | . |
+ * h | | . | m
+ * u | | . | a
+ * f | | . | x
+ * f | | . | l
+ * l | /+---------------+ | c
+ * e | / | c' ( 3 ) | | n
+ * | / +---------------+ |
+ * +--> * | b' ( 2 ) | /
+ * \ +---------------+ /
+ * \ | a' ( 1 ) | /
+ * \+---------------+ /
+ * | 0 | /
+ * +---------------+-------- -
+ *
+ */
+ if (pkp -> pk_dxerole & DTE_PLAYDCE) {
+ /* Sigh, reshuffle it */
+ for (i = pkp -> pk_maxlcn; i > 0; --i)
+ if (pkp -> pk_chan[i]) {
+ ni = RESHUFFLELCN(pkp -> pk_maxlcn, i);
+ pkp -> pk_chan[ni] = pkp -> pk_chan[i];
+ pkp -> pk_chan[i] = NULL;
+ pkp -> pk_chan[ni] -> lcd_lcn = ni;
+ }
+ }
+
+ for (i = 1; i <= pkp -> pk_maxlcn; ++i)
+ if ((lcp = pkp -> pk_chan[i]) != NULL) {
+ /* if (lcp -> lcd_so)
+ soisconnecting (lcp -> lcd_so); */
+ lcp -> lcd_template = pk_template (lcp -> lcd_lcn, X25_CALL);
+ pk_callrequest (lcp, lcp -> lcd_ceaddr, pkp -> pk_xcp);
+ (*pkp -> pk_ia -> ia_start)(lcp);
+ }
+}
+